XXL-JOB 使用笔记(附代码)
一: 分布式调度系统对比
开源产品对比:
![0](https://img2024.cnblogs.com/blog/1362669/202403/1362669-20240306193832873-1583608049.png)
Quartz 缺点:
1、不支持任务编排,无可视化编配页面
2、与业务高度耦合,系统侵入性严重
3.调度逻辑和QuartzJobBean耦合在同一个项目中,任务增加会导致系统性能瓶颈
4.quartz底层以“抢占式”获取DB锁并由抢占成功节点负责运行任务,会导致节点负载悬殊非常大
二、XXL-JOB 主要特征
1、介绍
一个轻量级分布式任务调度平台。
核心设计目标:开发迅速、学习简单、轻量级、易扩展
分布式任务调度的一体式解决方案,开箱即用。
2、主要特征
动态:---支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效
执行器HA(分布式):---任务分布式执行,任务”执行器”支持集群部署,可保证任务执行HA
弹性扩容缩容:---一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务
路由策略:---包括:第一个、最后一个、轮询、随机、一致性HASH等
任务失败重试:---支持自定义任务失败重试次数
任务失败告警:---默认提供邮件方式失败告警,同时预留扩展接口,可方便的扩展短信、钉钉等告警方式
全异步:---任务调度流程全异步化设计实现,如异步调度、异步运行、异步回调等
跨语言:---调度中心与执行器提供语言无关的RESTful API服务,支持java/Python/Shell/PHP等等
权限控制:---执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作
3、架构图
三、使用代码示例
1、引入maven依赖包
<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.2.0</version> </dependency>
2、配置文件中增加配置信息。 以nacos配置 为例:
xxl: job: admin: addresses: http://127.0.0.1:8114/xxl-job-admin // xxl服务注册地址 executor: appname: myself-test-job // 服务名称 ip: // 注册IP, 可以为空, 自动注册 port: 9993 // 注册端口号, address: // 注册地址,可为空 logpath: D:\data/applogs/xxl-job/jobhandler // xxl-job执行日志打印位置 logretentiondays: 30 // 日志保留时长 30天 accessToken: R9F1w2jjTBPKeKjt // xxl-job 校验token,
3、项目中初始化配置信息
package com.jobs.conf; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Created by Administrator */ @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; } }
4、使用
package com.jobs.jobs; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.handler.annotation.XxlJob; import com.xxl.job.core.log.XxlJobLogger; import com.yd.jobs.service.MessageService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import jakarta.annotation.Resource; @Component @Slf4j public class SendMqXxl extends IJobHandler { // 这里需要继承 IJobHandler @Resource MessageService service; /** * @return xxljob 执行结果 */ @Override @XxlJob("scheduledSendMsg") // 增加 @XxlJob 注解 public ReturnT<String> execute(String param) throws Exception { // 返回值 固定ReturnT<String> try { log.info("同步开始 : {}", System.currentTimeMillis()); service.scheduledSendMsg(); // 要执行的方法 XxlJobLogger.log("xxl-job, hello, param: {}", param); // 这种日志打印,回将信息打印到执行日志中。 return ReturnT.SUCCESS; } catch (Exception e) { log.error("同步失败 : {}", e.getMessage()); return ReturnT.FAIL; } } }
四、调度中心配置
1、配置执行器
执行器管理 -> 新增 (注册方式:自动注册 机器地址可以自动发现)
![0](https://img2024.cnblogs.com/blog/1362669/202403/1362669-20240306193832647-989494523.png)
任务管理 -> 新增
![0](https://img2024.cnblogs.com/blog/1362669/202403/1362669-20240306193832708-1514864201.png)
执行日志:
![0](https://img2024.cnblogs.com/blog/1362669/202403/1362669-20240306193832708-136988754.png)