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;/*** 执行器*/@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {XxlJobSpringExecutor executor = new XxlJobSpringExecutor();//调度中心地址executor.setAdminAddresses(adminAddresses);//执行器名称executor.setAppname(appname);//执行器地址executor.setAddress(address);//执行器ipexecutor.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-testaddress: http://127.0.0.1:9986ip: 127.0.0.1port: 9986logpath: /data/applogs/xxl-job/jobhandler #日志路径logretentiondays: -1 #执行器日志文件保存天数 [选填] : 过期日志自动清理, 大于等于3时生效; 否则, 如-1, 关闭自动清理功能spring:application:name: xxl-job-executorautoconfigure: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);@Overridepublic 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