# XXL-Job简单实战
本文作者:程序员飞云
# 分布式任务调度系统
分布式任务调度系统是用于协调和执行分布式场景中的任务。
可以理解为一个公司的老板给公司员工分配任务,保证每个人不会做重复的工作,提升效率,员工执行完任务向老板汇报。
主流的任务调度系统有 XXL-JOB,Elastic Job等等,此处使用XXL-JOB,相对简单易于使用。
# XXL-JOB
官方文档:分布式任务调度平台XXL-JOB (opens new window)
- 下载源码
- 创建数据库
需要找到doc/db/tables_xxl_job.sql
并且执行对应的sql语句
修改
xxl-job-admin
里面的application
的数据库配置启动项目
访问http://localhost:8080/xxl-job-admin
输入账号admin
密码123456
即可进入
可以在任务管理里面新增相应的任务管理,默认的是有测试任务
,这个是已经写好的案例,可以启动samples
里面的springboot
项目,即可运行。
执行任务前必须在执行器管理里面查看机器是否在线,如果不在线就无法调用ren'wu
# 入门案例步骤解析
- 引入依赖
<!-- https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.0</version>
</dependency>
2
3
4
5
6
- 配置执行器
需要手动创建一个XXL-JOB执行器的Bean
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
- 读取
application
配置文件
# web port
server.port=8081
# no web
#spring.main.web-environment=false
# log config
logging.config=classpath:logback.xml
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### xxl-job, access token
xxl.job.accessToken=default_token
### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9999
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 开发任务
案例里面包含了一个简单的SampleXxlJob
循环任务类,核心注解@XxlJob("demoJobHandler")
,我们可以开发自己的模拟任务。
开发步骤如下:官方提供
1、任务开发:在Spring Bean实例中,开发Job方法;
2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;
4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过
2
3
4
@Component
public class MyJobHandler {
@XxlJob("myJobHandler")
public void myJobHandler() throws InterruptedException {
Thread.sleep(3000);
System.out.println("你好,我是fly");
}
}
2
3
4
5
6
7
8
9
- 新建任务管理配置
必须要注意JobHandler
必须和注解@XxlJob
里面一致,然后点击操作执行,即可在控制台输出,如果希望在界面展示,必须使用XxlJobHelper.log
- 查看运行报表
测试过程中,可以发现即使在界面上关闭任务的执行,但是依然会执行没有完成的数据。
如果XXL-JOB
管理系统挂了,客户端不再执行定时任务,但是客户端会依然尝试重连XXL-JOB
管理端,等管理端重新上线后,会处理堆积请求。
# 核心原理
我们可以看到XXL-JOB
可以看作两个部分,一个是调度中心,一个是执行器。
执行器会向调度中心注册服务,调度中心会发布任务给执行器,执行器会通过相应的日志,回调通知调度中心。
类似老板和员工