当前位置: 首页 > news >正文

【XXL-JOB】XXL-JOB的搭建和使用

【XXL-JOB】XXL-JOB的搭建和使用

文章目录

  • 【XXL-JOB】XXL-JOB的搭建和使用
    • 1. 任务调度
      • 1.1 实现任务调度
        • 1.1.1 多线程实现
        • 1.1.2 Timer实现
        • 1.1.3 ScheduledExecutor实现
    • 2. 分布式任务调度
      • 2.1 采用分布式的原因
    • 3. XXL-JOB
      • 3.1 XXL-JOB介绍
      • 3.2 执行流程
    • 4. 搭建XXL-JOB
      • 4.1 创建数据库
      • 4.2 导入依赖,配置执行器
      • 4.3 调度中心配置
      • 4.4 执行任务
      • 4.5 查看日志
      • 4.6 停止任务

1. 任务调度

任务调度:顾名思义,就是对任务的调度,它是指系统为了完成特定业务,基于给定时间点,给定时间间隔或者给定执行次数自动执行任务

那么,我们如何去高效的处理一批任务呢?这里有两种方案:

  1. 多线程(多线程可以充分利用单机的资源)
  2. 分布式+多线程(充分利用多台计算机资源,每台计算机使用多线程)

方案2的可扩展性更强,这是一种分布式任务调度的处理方案。

那么什么又是分布式任务调度呢?

给定多个场景:

  • 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。
  • 某财务系统需要在每天上午10点前结算前一天的账单数据,统计汇总。
  • 某电商平台每天凌晨3点,要对订单中的无效订单进行清理。
  • 12306网站会根据车次不同,设置几个时间点分批次放票。
  • 。。。。。。

以上这些问题,就是任务调度需要解决的问题。


1.1 实现任务调度

1.1.1 多线程实现

我们可以开启一个线程,每隔一段时间就去执行一个任务。

如下代码所示:

这个程序的功能是每隔1s,执行一次。

public static void main(String[] args) {    //任务执行间隔时间final long timeInterval = 1000;Runnable runnable = new Runnable() {public void run() {while (true) {//TODO:somethingtry {Thread.sleep(timeInterval);} catch (InterruptedException e) {e.printStackTrace();}}}};Thread thread = new Thread(runnable);thread.start();
}

Jdk也为我们提供了相关支持,如Timer、ScheduledExecutor。


1.1.2 Timer实现

如下代码的功能是1s之后开始调度,并且每隔2s执行一次。

public static void main(String[] args){  Timer timer = new Timer();  timer.schedule(new TimerTask(){@Override  public void run() {  //TODO:something}  }, 1000, 2000);  //1秒后开始调度,每2秒执行一次
}

Timer 的优点在于简单易用,每个Timer对应一个线程,因此可以同时启动多个Timer并行执行多个任务,同一个Timer中的任务是串行执行。


1.1.3 ScheduledExecutor实现

public static void main(String [] agrs){ScheduledExecutorService service = Executors.newScheduledThreadPool(10);service.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {//TODO:somethingSystem.out.println("todo something");}}, 1,2, TimeUnit.SECONDS);
}

Java 5 推出了基于线程池设计的 ScheduledExecutor,其设计思想是,每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互之间不会受到干扰。


2. 分布式任务调度

通常任务调度的程序是集成在应用中的,比如:优惠卷服务中包括了定时发放优惠卷的的调度程序,结算服务中包括了定期生成报表的任务调度程序,由于采用分布式架构,一个服务往往会部署多个冗余实例来运行我们的业务,在这种分布式系统环境下运行任务调度,我们称之为分布式任务调度

如下图:

image-20230301194814914


2.1 采用分布式的原因

不管是任务调度程序集成在应用程序中,还是单独构建的任务调度系统,如果采用分布式调度任务的方式就相当于将任务调度程序分布式构建,这样就可以具有分布式系统的特点,并且提高任务的调度处理能力。

所以分布式调度要实现的目标是:

  1. 并行任务调度: 并行任务调度实现靠多线程,如果有大量任务需要调度,此时光靠多线程就会有瓶颈了,因为一台计算机CPU的处理能力是有限的。如果将任务调度程序分布式部署,每个结点还可以部署为集群,这样就可以让多台计算机共同去完成任务调度,我们可以将任务分割为若干个分片,由不同的实例并行执行,来提高任务调度的处理效率。
  2. 高可用:若某一个实例宕机,不影响其他实例来执行任务。
  3. 弹性扩容:当集群中增加实例就可以提高并行任务的处理效率。
  4. 任务管理与监测:对系统中存在的所有定时任务进行统一的管理及监测。让开发人员及运维人员能够时刻了解任务执行情况,从而做出快速的应急处理响应。
  5. 避免任务重复执行:当任务调度以集群方式部署,同一个任务调度可能会执行多次,比如在上面提到的电商系统中到点发优惠券的例子,就会发放多次优惠券,对公司造成很多损失,所以我们需要控制相同的任务在多个运行实例上只执行一次。

注:第五点尤为重要。


3. XXL-JOB

3.1 XXL-JOB介绍

XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

官网:XXL-JOB

文档:XXL-JOB文档

XXL-JOB主要有调度中心执行器任务

image-20230301200040297

  • 调度中心:
    • 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码
    • 主要职责为执行器管理、任务管理、监控运维、日志管理等
  • 执行器:
    • 负责接收调度请求并执行任务逻辑
    • 主要职责是注册服务、任务执行服务(接收到任务后会放入线程池中的任务队列)、执行结果上报、日志服务等
  • 任务:
    • 负责执行具体的业务处理。

3.2 执行流程

调度中心与执行器之间的工作流程如下:

image-20230301200452907

执行流程:

  1. 任务执行器根据配置的调度中心的地址,自动注册到调度中心
  2. 达到任务触发条件,调度中心下发任务
  3. 执行器基于线程池执行任务,并把执行结果放入内存队列中,把执行日志写入日志文件中
  4. 执行器消费内存队列中的执行结果,主动上报给调度中心。
  5. 当用户在调度中心查看任务日志,调度中心请求任务执行器,任务执行器读取任务日志文件并返回日志详情。

4. 搭建XXL-JOB

首先下载XXL-JOB:

  • GitHub:https://github.com/xuxueli/xxl-job
  • Gitee:https://gitee.com/xuxueli0323/xxl-job

下载后使用idea打开项目:

image-20230301210357133

项目模块有三个:

  • xxl-job-admin:调度中心
  • xxl-job-core:项目的核心包
  • xxl-job-executor-samples:执行器示例代码(可参考)
    • xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器,推荐这种方式;
    • xxl-job-executor-sample-frameless:无框架版本;
  • doc:文档资料,包含数据库脚本

4.1 创建数据库

创建数据库,并导入doc文档中的数据库脚本:

image-20230301210848082

导入成功之后,运行xxl-job-admin项目,登陆账号为:admin,密码为:123456


4.2 导入依赖,配置执行器

1)导入依赖

在我们需要执行任务调度的模块中导入如下依赖:

<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId>
</dependency>

2)yml配置

在配置文件(可以在nacos或本地文件)中配置:

xxl:job:admin: addresses: http://localhost:8080/xxl-job-adminexecutor:appname: media-process-service #执行器名字(很重要,在调度中心要用到)address: ip: port: 9999 #执行器端口号logpath: /data/applogs/xxl-job/jobhandlerlogretentiondays: 30accessToken: default_token

3)配置xxl-job的执行器

将示例工程下的配置类拷贝到自己的service工程下:

image-20230301211727638


4.3 调度中心配置

进入调度中心添加执行器:

image-20230301211854828

点击新增,弹出如下对话框:

image-20230301212024511

图中的 AppName 填我们上面配置文件中配置的执行器名字,名称随意。其他的可以不填。

填写完毕之后点击保存。

image-20230301212231804

重新运行我们的项目,如果控制台中输出如下内容说明执行器在调度中心注册成功:

image-20230301212326198

同时,我们可以在调度中心中查看到执行器的地址:

image-20230301212406237


4.4 执行任务

我们复制示例工程中的 SampleXxjJob 到我们的项目中:

image-20230301212507507

我们删除部分代码,只留如下代码(任务代码):

@Component
public class SampleXxlJob {private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);/*** 1、简单任务示例(Bean模式)*/@XxlJob("demoJobHandler")//记住这个名字,后面要使用public void demoJobHandler() throws Exception {XxlJobHelper.log("XXL-JOB, Hello World.");for (int i = 0; i < 5; i++) {XxlJobHelper.log("beat at:" + i);TimeUnit.SECONDS.sleep(2);}// default success}
}

1)在调度中心添加任务

进入调度中心,在任务管理中新增任务:

image-20230301212722378

点击新增,填写任务信息:

image-20230301212807950

注意红色标记处:

调度类型选择Cron,并配置Cron表达式设置定时策略。

Cron表达式是一个字符串,通过它可以定义调度策略,格式如下:

{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}

xxl-job提供图形界面去配置:

image-20230301212846797

运行模式有BEAN和GLUE,bean模式较常用就是在项目工程中编写执行器的任务代码,GLUE是将任务代码编写在调度中心。

JobHandler任务方法名填写@XxlJob注解中的名称。

添加成功后,启动任务。

image-20230301213029511


4.5 查看日志

点击左侧菜单栏“调度日志”即可查看任务执行情况:

image-20230301213139238

任务执行了一段之间要注意清理日志,点击右上角的“清理”按钮即可。


4.6 停止任务

如果想要停止任务,需要在调度中心中操作:

image-20230301213327743

相关文章:

【XXL-JOB】XXL-JOB的搭建和使用

【XXL-JOB】XXL-JOB的搭建和使用 文章目录【XXL-JOB】XXL-JOB的搭建和使用1. 任务调度1.1 实现任务调度1.1.1 多线程实现1.1.2 Timer实现1.1.3 ScheduledExecutor实现2. 分布式任务调度2.1 采用分布式的原因3. XXL-JOB3.1 XXL-JOB介绍3.2 执行流程4. 搭建XXL-JOB4.1 创建数据库…...

HCIP-5OSPF基本原理及基本配置学习笔记

1、OSPF基本原理 开放式最短路径优先OSPF&#xff08;Open Shortest Path First&#xff09;协议是IETF定义的一种基于链路状态的内部网关路由协议。 RIP是一种基于距离矢量算法的路由协议&#xff0c;存在着收敛慢、易产生路由环路、可扩展性差等问题&#xff0c;目前已逐渐被…...

Migrate your data into databend with DataX

现在互联网应用越来越复杂&#xff0c;每个公司都会有多种多样的数据库。通常是用最好的硬件来跑 OLTP&#xff0c;甚至还在 OLTP 中进行分库分表来满足业务&#xff0c;这样对于一些分析&#xff0c;聚合&#xff0c;排序操作非常麻烦。这也有了异构数据库的数据同步需求&…...

ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)

【ansible 设置host为localhost&#xff0c;执行ping命令报错】 [eniq-slocalhost ansible]$ ansible all -m ping -i inventory localhost | UNREACHABLE! > { "changed": false, "msg": "Failed to connect to the host via ssh: Perm…...

有限元中三角形的一些积分公式

文章目录有限元中三角形的相关积分公式有限元中三角形的相关积分公式 在 xyxyxy 平面中&#xff0c; 通过三个点 (xi,yi),(xj,yj),(xm,ym)(x_i, y_i), (x_j, y_j), (x_m, y_m)(xi​,yi​),(xj​,yj​),(xm​,ym​) 定义一个三角形&#xff0c; 令坐标原点位于其中心(或者重心)…...

【docker-compose】安装mongodb

1. 安装方式 压缩包容器安装docker&#xff08;推荐&#xff0c;一分钟安装&#xff09; 2. 环境 linux服务器已安装好 docker docker-compose &#xff08;不了解的客官&#xff0c;请点击进入&#xff09; 3. 步骤&#xff1a; Step 1&#xff1a; linux下建立如下目录…...

【ClickHouse源码】物化视图的写入过程

本文对 ClickHouse 物化视图的写入流程源码做个详细说明&#xff0c;基于 v22.8.14.53-lts 版本。 StorageMaterializedView 首先来看物化视图的构造函数&#xff1a; StorageMaterializedView::StorageMaterializedView(const StorageID & table_id_,ContextPtr local_…...

.NET 使用NLog增强日志输出

引言 不管你是开发单体应用还是微服务应用&#xff0c;在实际的软件的开发、测试和运行阶段&#xff0c;开发者都需要借助日志来定位问题。因此一款好的日志组件将至关重要&#xff0c;在.NET 的开源生态中&#xff0c;目前主要有Serilog、Log4Net和NLog三款优秀的日志组件&…...

一道阿里类的初始化顺序笔试题

问题很简单&#xff0c;就是下面的代码打印出什么&#xff1f; public class InitializeDemo {private static int k 1;private static InitializeDemo t1 new InitializeDemo("t1" );private static InitializeDemo t2 new InitializeDemo("t2");priv…...

cuda找不到路径报错

编译C文件时出现&#xff1a;error: [Errno 2] No such file or directory: :/usr/local/cuda:/usr/local/cuda/bin/nvcc 在终端输入&#xff1a; export CUDA_HOME/usr/local/cuda...

Elasticsearch进阶之(核心概念、系统架构、路由计算、倒排索引、分词、Kibana)

Elasticsearch进阶之&#xff08;核心概念、系统架构、路由计算、倒排索引、分词、Kibana&#xff09; 1、核心概念&#xff1a; 1.1、索引&#xff08;Index&#xff09; 一个索引就是一个拥有几分相似特征的文档的集合。比如说&#xff0c;你可以有一个客户数据的索引&…...

Android包体积缩减

关于减小包体积的方案&#xff1a; 一、所有的图片压缩&#xff0c;采用webp 格式。 &#xff08;当然有些图片采用webp格式反而变大了&#xff0c;可以仍采用png格式&#xff09; 二、语音资源过滤 只保留中文 resConfigs "zh-rCN", "zh” 可以减少resourc…...

【华为OD机试】 网上商城优惠活动(C++ Java Javascript Python)

文章目录 题目描述输入描述输出描述备注用例题目解析C++JavaScriptJavaPython题目描述 某网上商场举办优惠活动,发布了满减、打折、无门槛3种优惠券,分别为: 每满100元优惠10元,无使用数限制,如100199元可以使用1张减10元,200299可使用2张减20元,以此类推;92折券,1次…...

GWT安装过程

1:安装前准备 &#xff08;可以问我要&#xff09; appengine-java-sdk-1.9.8 com.google.gdt.eclipse.suite.4.3.update.site_3.8.0 gwt-2.5.1 eclipse-jee-kepler-SR2-win32-x86_64.zip 2&#xff1a;安装环境上 打开eclipse Help –Install New Software… 选择Add –…...

代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

Leetcode 704 二分查找题目链接&#xff1a;704二分查找介绍给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。思路先看看一个…...

office@word@ppt启用mathtype组件方法整理

文章目录将mathtype添加到word中ref查看office安装路径文件操作法Note附PPT中使用mathtype将mathtype添加到word中 先安装office,再安装mathtype,那么这个过程是自动的如果是先安装mathtype,再安装office,那么有以下选择: 重新安装一遍mathtype(比较简单,不需要说明)执行文件操…...

计算机大小端

我们先假定内存结构为上下型的&#xff0c;上代表内存高地址&#xff0c;下代表内存低地址。 电脑读取内存数据时&#xff0c;是从低位地址到高位地址进行读取&#xff08;从下到上&#xff09;。 1、何为大小端 大端&#xff1a;数据的高位字节存放在低地址&#xff0c;数据…...

Matplotlib绘图从零入门到实践(含各类用法详解)

一、引入 Matplotlib 是一个Python的综合库&#xff0c;用于在 Python 中创建静态、动画和交互式可视化。 本教程包含笔者在使用Matplotlib库过程中遇到的各类完整实例与用法还有遇到的库理论问题&#xff0c;可以根据自己的需要在目录中查询对应的用法、实例以及第四部分关于…...

C语言 入门教程||C语言 指针||C语言 字符串

C语言 指针 学习 C 语言的指针既简单又有趣。通过指针&#xff0c;可以简化一些 C 编程任务的执行&#xff0c;还有一些任务&#xff0c;如动态内存分配&#xff0c;没有指针是无法执行的。所以&#xff0c;想要成为一名优秀的 C 程序员&#xff0c;学习指针是很有必要的。 …...

Nacos2.x+Nginx集群配置

一、配置 nacos 集群 注意&#xff1a;需要先配置好 nacos 连接本地数据库 1、拷贝三份 nacos 2、修改配置文件&#xff08;cluster.conf&#xff09; 修改启动端口&#xff1a; nacos1&#xff1a;8818 nacos2&#xff1a;8828 nacos3&#xff1a;8838 当nacos客户端升级为…...

Android源码分析 - InputManagerService与触摸事件

0. 前言 有人问到&#xff1a;“通过TouchEvent&#xff0c;你可以获得到当前的触点&#xff0c;它更新的频率和屏幕刷新的频率一样吗&#xff1f;”。听到这个问题的时候我感到很诧异&#xff0c;我们知道Android是事件驱动机制的设计&#xff0c;可以从多种服务中通过IPC通信…...

python库--urllib

目录 一.urllib导入 二.urllib爬取网页 三.Headers属性 1.使用build_opener()修改报头 2.使用add_header()添加报头 四.超时设置 五.get和post请求 1.get请求 2.post请求 urllib库和request库作用差不多&#xff0c;但比较起来request库更加容易上手&#xff0c;但该了…...

美团前端二面常考react面试题及答案

什么原因会促使你脱离 create-react-app 的依赖 当你想去配置 webpack 或 babel presets。 React 16中新生命周期有哪些 关于 React16 开始应用的新生命周期&#xff1a; 可以看出&#xff0c;React16 自上而下地对生命周期做了另一种维度的解读&#xff1a; Render 阶段&a…...

环境搭建04-Ubuntu16.04更改conda,pip的镜像源

我常用的pipy国内镜像源&#xff1a; https://pypi.tuna.tsinghua.edu.cn/simple # 清华 http://mirrors.aliyun.com/pypi/simple/ # 阿里云 https://pypi.mirrors.ustc.edu.cn/simple/ #中国科技大学1、将conda的镜像源修改为国内的镜像源 先查看conda安装的信息…...

【C++进阶】四、STL---set和map的介绍和使用

目录 一、关联式容器 二、键值对 三、树形结构的关联式容器 四、set的介绍及使用 4.1 set的介绍 4.2 set的使用 五、multiset的介绍及使用 六、map的介绍和使用 6.1 map的介绍 6.2 map的使用 七、multimap的介绍和使用 一、关联式容器 前面已经接触过 STL 中的部分…...

JavaSE学习进阶 day1_01 static关键字和静态代码块的使用

好的现在我们进入进阶部分的学习&#xff0c;看一张版图&#xff1a; 前面我们已经学习完基础班的内容了&#xff0c;现在我们已经来到了第二板块——基础进阶&#xff0c;这部分内容就不是那么容易了。学完第二板块&#xff0c;慢慢就在向java程序员靠拢了。 面向对象进阶部分…...

苹果笔可以不买原装吗?开学必备性价比电容笔

在当今的时代&#xff0c;电容笔日益普及&#xff0c;而且相关的功能也逐渐完善。因此&#xff0c;在使用过程中&#xff0c;怎样挑选一款性价比比较高的电容笔成为大家关心的焦点。随着电容笔的普及&#xff0c;更好更便宜的电容笔成为了一种趋势。那么&#xff0c;哪个品牌的…...

数据库连接与properties文件

管理properties数据库&#xff1a; 现在pom文件中加入Druid的坐标&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency>配置文件中添加相应的数据&…...

Linux上的校验和验证

校验和&#xff08;checksum&#xff09;程序用来从文件中生成相对较小的唯一密钥。我们可以重新计算该密钥&#xff0c;用以检查文件是否发生改变。修改文件可能是有意为之&#xff08;添加新用户会改变密码文件&#xff09;&#xff0c;也可能是无意而为&#xff08;从CD-ROM…...

杂记——14.git在idea上的使用及其实际开发介绍

这篇文章我们来讲一下git在idea上的使用&#xff0c;以及在实际开发过程中各个分支的使用及其具体的流程 目录 1.git在idea上的使用 1.1 idea上的git提交 1.2 idea上的分支切换 2.git在实际运用时的分支及其流程 2.1分支介绍 2.2具体流程 3.小结 1.git在idea上的使用 …...

上海网站建设免费推荐/免费b站在线观看人数在哪里找到

目录 一、软件测试的生命周期 二、如何描述一个bug 一、软件测试的生命周期 软件测试的生命周期&#xff1a; 需求分析→测试计划→ 测试设计、测试开发→ 测试执行→ 测试评估 需求阶段 –测试人员了解需求、对需求进行分解&#xff0c;得出测试需求 计划阶段 -根据需求编写…...

h5技术网站/seo外包公司哪家好

一、概述Python中的 数值类型(Numeric Types)共有5种&#xff1a;布尔型(bool)、整型(int)、长整型(long)、浮点型(float)和复数(complex)。数值类型支持的主要操作如下&#xff1a;操作说明boolintlongfloatcomplexx ** y指数运算√√√√√x符号不变√√√√√-x符号取反√√…...

三亚做网站服务/seo搜索引擎优化怎么优化

http://www.cocoachina.com/industry/20131106/7304.html 转载于:https://www.cnblogs.com/sgdkg/p/4365491.html...

活动手机网站开发/营销型网站特点

今天我们学习几个常用的Dockerfile指令&#xff0c;在 http://docs.docker.com/reference/builder/可以查看Dockerfile中能使用的全部指令的清单。 一、CMD指令 CMD指令用于指定一个容器启动时要运行的命令&#xff0c;这与RUN指令有点类似&#xff0c;但RUN指令是指定镜像被…...

厦门企业建站系统模板/公司网站推广方案

数据 3 分钟由 ACDU (中国 DBA 联盟) 与墨天轮联合出品的全新视频节目上线啦&#xff5e;三分钟带你来了解数据行业动态&#xff0c;节目内容主要包含数据行业最新的产品发布、公司大事件、行业新闻等。每周五更新&#xff0c;不见不散&#xff5e;本期内容概览&#xff1a;202…...

php怎么做全网小视频网站/seo必备软件

实验步骤一 generate()方法,生成字符串,要求字符串为“haihai”或者“world!”,如下: getone()方法生成随机的四、六位数,这个方法只会生成一个结果。如果使用的是generate()方法,那么会列出所有的可能。随机生成一个时间实验步骤二 # -*- coding: utf-8 -*- #大小写ZH…...