一: 分布式调度系统对比
开源产品对比: 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; } } }