xxl-job从入门到入土
xxl-job介绍
xxl-job是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。xxl-job支持调度中心集群和执行器集群。
xxl-job开源项目
xxl-job使用
xxl-job整合SpringBoot
- 引入xxl-job的依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.0</version>
</dependency>
- xxl-job执行器配置
@Configuration
@Slf4j
public class XxlJobConfig {
@Value("${xxl.job.admin.address}")
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() {
XxlJobSpringExecutor executor = new XxlJobSpringExecutor();
//调度中心地址
executor.setAdminAddresses(adminAddresses);
//执行器名称
executor.setAppname(appname);
//执行器地址
executor.setAddress(address);
//执行器ip
executor.setIp(ip);
//执行器端口,如果集单机群部署,则执行器的端口需要不一样
executor.setPort(port);
//需要和调度中心配置文件中的配置一致
executor.setAccessToken(accessToken);
//执行器日志存储路径
executor.setLogPath(logPath);
//执行器日志文件保存天数,过期日志自动清理, 大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
executor.setLogRetentionDays(logRetentionDays);
return executor;
}
}
- application.yml文件
xxl:
job:
accessToken: default_token #与xxl-job-admin配置一致
admin:
address: http://localhost:8080/xxl-job-admin #xxl-job-admin地址
executor: #执行器配置,执行器就是被调度中心调度的任务
appname: xxl-job-executor-test
address: http://127.0.0.1:9986
ip: 127.0.0.1
port: 9986
logpath: /data/applogs/xxl-job/jobhandler #日志路径
logretentiondays: -1 #执行器日志文件保存天数 [选填] : 过期日志自动清理, 大于等于3时生效; 否则, 如-1, 关闭自动清理功能
spring:
application:
name: xxl-job-executor
autoconfigure:
exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
server:
port: 9987 #应用的port和执行器的port需要不一致,不然启动会报错
到这里为止,执行器的配置就完成了,但是项目不能正常启动,因为需要调度中心。
- 下载xxl-job项目,启动调度中心应用,在调度中心中创建执行器,执行器的AppName需要和执行器的配置文件中的appname保持一致,注册方式选择自动注册后,如果执行器能注册到调度中心,则会自动获取到执行器的地址,如果没有获取到地址后面执行会报错
- 启动执行器,看执行器的机器地址是否为空就能知道执行器有没有成功注册了
定时任务
注册定时任务有两种方式,一种是继承IJobHanlder类,还有一种是使用@xxlJob注解
继承IJobHanlder
继承IJobHanlder类后,需要使用执行器的registerHandler方法注册到执行器中,不然会执行任务会报错。
@Component("testJobHandler")
public class TestJobHandler extends IJobHandler {
private Logger logger = LoggerFactory.getLogger(TestJobHandler.class);
@Override
public void execute() throws Exception {
logger.info("TestJobHandler execute ......");
}
}
使用执行器注册该任务
executor.registJobHandler("testJobHandler", new TestJobHandler());
不推荐使用这种方式注册任务。
@xxlJob
使用注解的缺点是需要在调度中心后台手动配置任务
/**
* 这里需要返回一个结果,否则任务调度中心上调度日志的执行结果显示成功,但是调度结果显示失败
*/
@XxlJob("testJob1")
public ReturnT<String> executeJob() {
logger.info("testJob1 executor: " + serverPort);
return ReturnT.SUCCESS;
}
在调度中心配置对应任务,JobHandler需要和注解中的"testJob1"保持一致
对于需要手动注册定时任务的问题,网上有相应的解决方案
魔改xxl-job,彻底告别手动配置任务!
调度中心介绍
调度中心有6个大功能,需要重点关注的是任务管理和执行器管理。
执行器管理
执行器管理的配置不多,比较简单,上文中已经介绍了,这里就不多说了。
任务管理
一个任务有下图所示的配置。
- 基础配置
- 报警邮件:
- 调度配置:设置任务的执行周期,执行一次还是周期性执行
任务配置
- 运行模式
- Bean:上文提到的两种定时任务的运行模式都是Bean
- GLUE:将定时任务的执行逻辑以代码的形式直接嵌入到执行器中。这种方式适用于需要频繁更新任务逻辑的场景
GLUE模式
创建一个GLUE模式的任务,可以看到此时JobHandler是只读的。
在列表上选择GLUE模式的任务,操作红会有一个GLUE IDE,点击这个按钮
输入需要执行的逻辑即可,建议在IDE中写好,直接复制过去。在GLUE任务的代码里面也是可以@Autowired等注解的,写好后保存即可。
高级配置
- 路由模式:将一个任务分发到多个执行器上执行的方式
- 广播模式:所有执行器都会接收到任务并执行
- 分片模式:将任务分片,每个执行器执行其中的一部分
- 固定模式:指定某个执行器执行任务
- 轮询模式:按照轮询的模式选择执行
- 调度过期策略:当任务执行超过预定时间后如何处理
- 忽略:当调度中心错过调度时间时,忽略此次调度,不再进行补偿处理
- 立即执行一次:当调度中心错过调度时间时,立即进行一次补偿触发,以确保任务能够被执行
- 阻塞处理策略
- 单机串行:默认的阻塞处理策略,当任务队列中的任务数量达到上限时,新的任务请求会在当前执行器中串行执行
- 弃后续调度:当任务队列中的任务数量达到上限时,新的任务请求会被直接丢弃
- 覆盖之前调度:当任务队列中的任务数量达到上限时,新的任务请求会覆盖之前的任务请求
集群
调度中心集群
XXL-JOB调度中心集群部署配置
执行器集群
xxl-job执行器集群部署及路由策略实践
微服务架构下执行器的整合
主要是两种思路:
- 将执行器整合到业务的服务实例中,比如将执行器和任务都放在库存服务中
- 单独抽出一个执行器服务,通过Feign调用其它业务服务
参考
- xxl-job执行器集群部署及路由策略实践
- XXL-JOB调度中心集群部署配置
- xxl-job