《分布式任务调度平台xxljob》手册.
- 格式:pdf
- 大小:2.52 MB
- 文档页数:12
《分布式任务调度平台XXL-JOB》手册文档历史记录目录1:简介 (3)2:安装 (3)3:配置 (3)3.1数据库准备 (4)3.2源码准备 (5)3.3部署准备 (5)3.3.1 配置部署“调度中心” (5)3.3.2 配置部署“执行器项目” (7)4:使用 (9)步骤一:新建任务 (9)步骤二:“GLUE模式(Java)”任务开发 (10)步骤三:触发执行 (10)步骤四:查看日志 (10)5:总结 (11)1:简介XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展,XXL-JOB是基于开源Quartz 调度内核的、为方便企业调度场景而开源的一款实用的调度工具。
自带任务配置页面,任务监控,分布式执行器等功能。
2:安装下载地址(最新1.9版本迭代中,可选择稳定版本1.8.2下载)码云:https:///xuxueli0323/xxl-job/tree/v1.8.23:配置解压下载文件,得到如下文件结构,- /doc :文档资料- /db :“调度数据库”建表脚本- /xxl-job-admin :调度中心,项目源码- /xxl-job-core :公共Jar依赖- /xxl-job-executor-samples :执行器,Sample示例项目3.1数据库准备使用mysql 新建数据库xxl-job ,导入下载文件夹中/doc/db/tables_xxl_job.sql 文件,应生成16张表,如图所示。
3.2源码准备按照maven格式将源码导入IDE,使用maven进行编译即可,源码结构如下xxl-job-admin:调度中心xxl-job-core:公共依赖xxl-job-executor:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器):xxl-job-executor-sample-spring:Spring版本,通过Spring容器管理执行器,比较通用;:xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器;:xxl-job-executor-sample-jfinal:JFinal版本,通过JFinal管理执行器;:xxl-job-executor-sample-nutz:Nutz版本,通过Nutz管理执行器;3.3部署准备3.3.1 配置部署“调度中心”调度中心项目:xxl-job-admin作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。
SpringBoot整合Xxl-job实现定时任务的全过程⽬录前⾔⼀、部署调度中⼼1、项⽬下载2、初始化数据3、修改properties配置⽂件⼆、部署SpringBoot项⽬1、引⼊依赖2、创建配置类3、修改配置⽂件4、创建执⾏器5、启动SpringBoot项⽬三、通过调度中⼼进⾏任务调度1、添加执⾏器2、添加任务3、任务调度中⼼发起任务调度四、⼩结总结前⾔XXL-JOB是⼀个分布式任务调度平台,其核⼼设计⽬标是开发迅速、学习简单、轻量级、易扩展。
现已开放源代码并接⼊多家公司线上产品线,开箱即⽤。
如果是单机并且定时任务不多的情况,可以选择Timer注解@Scheduled或者Cron⼯具类等⽅式来实现,但是这有个缺点,那就是定时任务会写死在代码中,⼀旦启动,就不能暂停或者修改。
如果修改的话,整个还项⽬要重新编译,这属实⾮常的⿇烦。
本篇⽂章将会介绍如何通过xxl-job来实现任务的调度⼀、部署调度中⼼1、项⽬下载下⾯是调度中⼼代码的gitee地址,可以colon到本地/xuxueli0323/xxl-job2、初始化数据在下载好的项⽬中的doc/db⽬录下有⼀个tables_xxl_job.sql⽂件,先放到⾃⼰的数据库中执⾏,其实就是初始化好调度中⼼需要的表结构和数据3、修改properties配置⽂件⼆、部署SpringBoot项⽬1、引⼊依赖<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.2.0</version></dependency>2、创建配置类@Configurationpublic class XxlJobConfig {private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.executor.appname}")private String appName;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${xxl.job.executor.logpath}")private String logPath;@Value("${xxl.job.executor.logretentiondays}")private int logRetentionDays;@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appName);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}}3、修改配置⽂件xxl:job:admin:addresses: http://127.0.0.1:8080/xxl-job-admin #部署的调度中⼼的urlexecutor:appname: xxl-job-volunteer-executor #执⾏器的名字ip:port: 9999 #调度中⼼调⽤执⾏器时使⽤的端⼝logpath: /data/apploggs/xxl-job/jobhandler #⽇志路径logretentiondays: 30 #⽇志保留天数accessToken:4、创建执⾏器@Componentpublic class XxlJobSample {// myDemoJob是任务的名字,也是Spring中bean的名字@XxlJob("myDemoJob")public ReturnT<String> myDemoJob(String value) {System.out.println("myDemoJob:定时任务触发:" + value);return ReturnT.SUCCESS;}}5、启动SpringBoot项⽬启动成功后会看到下⾯两⾏⽇志信息,可以看到成功连接到了调度中⼼然后注册了将要被调度任务>>>>>>>>>>> xxl-job register jobhandler success, name:myDemoJob, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@1f94dd63[class ponent.XxlJobSample#myDemoJob] >>>>>>>>>>> xxl-job remoting server start success, nettype = class com.xxl.job.core.server.EmbedServer, port = 9999三、通过调度中⼼进⾏任务调度1、添加执⾏器输⼊配置⽂件中配置的appName,名称可以随意2、添加任务新增调度任务查看调度任务3、任务调度中⼼发起任务调度在SpringBoot项⽬中可以看到控制台输出如下信息:2022-01-16 11:54:05.039 INFO 7836 --- [Pool-1148366645] c.xxl.job.core.executor.XxlJobExecutor : >>>>>>>>>>> xxl-job regist JobThread success, jobId:7, handler:com.xxl.job.core.handler.impl.MethodJobHandler@1f94dd63[class pone myDemoJob:定时任务触发:testParam2022-01-16 11:55:38.059 INFO 7836 --- [ Thread-22] com.xxl.job.core.thread.JobThread : >>>>>>>>>>> xxl-job JobThread stoped, hashCode:Thread[Thread-22,10,main]四、⼩结⾄此,SpringBoot整合Xxl-job就完成了,刚才的⽰例代码其实对于原来的项⽬还是有⼀定的侵⼊性的,上⾯仅仅演⽰了BEAN运⾏模式,说⽩了就是调⽤加了@XxlJob的⽅法。
(19)国家知识产权局(12)发明专利申请(10)申请公布号 (43)申请公布日 (21)申请号 202210021289.X(22)申请日 2022.01.10(71)申请人 广东联合电子服务股份有限公司地址 510000 广东省广州市天河区体育西路189号15楼(72)发明人 黄强 李昊淼 张佳松 (74)专利代理机构 广州市越秀区哲力专利商标事务所(普通合伙) 44288专利代理师 徐鹏(51)Int.Cl.G06F 9/48(2006.01)G06F 21/31(2013.01)G06F 21/62(2013.01)(54)发明名称基于XXL-JOB的任务调度系统(57)摘要本申请公开了一种基于XXL ‑JOB的任务调度系统,涉及计算机技术,包括:Web模块,用于响应浏览器的访问请求,并向浏览器返回可交互界面;任务调度模块,用于根据Web模块采集的针对所述可交互界面的操作指令进行响应,所述任务调度模块至少用于调度针对数据库的操作任务;其中,所述可交互界面的输入框配置有校验程序,所述校验程序用于校验所述输入框的输入数据是否为SQL指令,当所述输入数据为SQL指令时,拦截该输入数据。
本申请实施例可以在采用XXL ‑JOB实现数据库任务调度的场景下,通过防注入措施保障系统得到安全。
权利要求书1页 说明书4页 附图1页CN 114528077 A 2022.05.24C N 114528077A1.一种基于XXL ‑JOB的任务调度系统,其特征在于,包括:Web模块,用于响应浏览器的访问请求,并向浏览器返回可交互界面;任务调度模块,用于根据Web模块采集的针对所述可交互界面的操作指令进行响应,所述任务调度模块至少用于调度针对数据库的操作任务;其中,所述可交互界面的输入框配置有校验程序,所述校验程序用于校验所述输入框的输入数据是否为SQL指令,当所述输入数据为SQL指令时,拦截该输入数据。
2.根据权利要求1所述的基于XXL ‑JOB的任务调度系统,其特征在于,所述可交互界面中包括任务调度列表和所述任务调度列表中各任务项的信息和操作按钮,所述任务调度模块根据针对所述操作按钮的操作执行进行响应。
xxl-job调度任务简单使⽤1. 简介XXL-JOB是⼀个分布式任务调度平台,其核⼼设计⽬标是开发迅速、学习简单、轻量级、易扩展。
现已开放源代码并接⼊多家公司线上产品线,开箱即⽤。
2. 使⽤步骤1:源码下载数据库脚本再源码/xxl-job/doc/db/tables_xxl_job.sql3.调度中⼼项⽬:xxl-job-admin修改配置⽂件中的数据库地址或端⼝/xxl-job/xxl-job-admin/src/main/resources/application.properties4.启动xxl-job-admin⼯程访问地址为:账号/密码 admin/1234565.⾄此,xxl-job服务启动完成,接下来将xxl植⼊到所要添加定时任务的⼯程中此次测试我使⽤的是:2.3.0版本<!-- /maven2/com/xuxueli/xxl-job-core/ --><dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.0</version></dependency>6.修改⼯程的yml⽂件,引⼊xxl配置#引⼊xxl-jobxxl:job:admin:# 调度中⼼部署跟地址 [选填]:如调度中⼼集群部署存在多个地址则⽤逗号分隔。
# 执⾏器将会使⽤该地址进⾏"执⾏器⼼跳注册"和"任务结果回调";为空则关闭⾃动注册;addresses: http://localhost:8080/xxl-job-adminexecutor:# 执⾏器AppName [选填]:执⾏器⼼跳注册分组依据;为空则关闭⾃动注册appname: springcloudalibaba-user-experience-job# 执⾏器IP [选填]:默认为空表⽰⾃动获取IP,多⽹卡时可⼿动设置指定IP,该IP不会绑定Host仅作为通讯实⽤;# address: http://192.168.2.29:9191# 地址信息⽤于 "执⾏器注册" 和 "调度中⼼请求并触发任务";# ip: 192.168.2.29# 执⾏器运⾏⽇志⽂件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使⽤默认路径;logpath: ./logs/xxl-job# 执⾏器⽇志⽂件保存天数 [选填] :过期⽇志⾃动清理, 限制值⼤于等于3时⽣效; 否则, 如-1, 关闭⾃动清理功能;logretentiondays: 30# 执⾏器端⼝号 [选填]:⼩于等于0则⾃动获取;默认端⼝为9999,# 单机部署多个执⾏器时,注意要配置不同执⾏器端⼝;port: 9192# 执⾏器通讯TOKEN [选填]:⾮空时启⽤;# accessToken:7.添加config配置⽂件import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Profile;/*** xxl-job config** @author* @date 2020/11/23*/@Slf4j@Configuration@Profile("!dev")public class XxlJobConfig {@Value("${xxl.job.admin.addresses}")private String adminAddresses;@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;/*** 注意:如果想本机调试,需要设置address、ip* @return*/@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appName);//xxlJobSpringExecutor.setAddress(address);xxlJobSpringExecutor.setPort(port);//xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}}8.执⾏器管理--》添加执⾏器添加完成后,可以点击查看详情9.再代码中创建定时任务import com.alibaba.fastjson.JSONObject;import com.xxl.job.core.context.XxlJobHelper;import com.xxl.job.core.handler.annotation.XxlJob;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.InitializingBean;import ponent;import java.util.Date;@Slf4j@Componentpublic class UserJob1 implements InitializingBean {/*** 定时同步群发任务结果** @return*/@XxlJob("xxlJobTest")public String execute() {("start userTodoJob, time at:" + new Date());String params = XxlJobHelper.getJobParam();JSONObject jsonObject = JSONObject.parseObject(params);Integer orgId = jsonObject.getInteger("orgId");String corpId = jsonObject.getString("corpId");System.out.println("执⾏了"+params);return "执⾏了";}@Overridepublic void afterPropertiesSet() throws Exception {("Combination Job init suc at: " + new Date());}}10.任务管理中添加新的任务添加完成后,可再后⾯对该任务进⾏操作。
xxl-job介绍什么是任务调度什么是任务调度?某⼀时间段进⾏任务的操作。
具体任务调度有哪些应⽤的场景?数据同步、交易信息、清除⽤户的信息、定期发送报表数据、活动推送等。
传统实现定时任务的⽅式?Thread、TimeTask、ScheduleExecutorService、Quartz 等;不过,这⼏种⽅式都是在单点系统使⽤,⼀旦Job服务器宕机之后,就必须采取⼀些措施;具体操作如下:(1) 使⽤⼼跳检测监控⾃动重启、任务补偿机制(任务做标记)(2) 定时任务在执⾏代码的时候中间突然报错,使⽤⽇志记录错误,跳过继续执⾏,在使⽤定时Job 扫描⽇志错误记录,进⾏补偿信息。
(3) 定时Job 在执⾏的时候,导致整个 Job 异常结束掉,发送邮件通知给运维⼈员。
分布式定时任务的⽅式?XXL-Job、Elastic-job等。
不过,既然采⽤分布式,那么肯定会遇到项⽬部署集群,导致任务重复执⾏多次;具体操作如下:(1) Zookeeper 实现分布式锁,每次保证拿到锁再执⾏,效率⽐较低。
(2) 配置⽂件中加⼊定时任务的开关,但是只能保证⼀台服务器执⾏,变为单击服务器。
(3) 启动的时候使⽤数据库唯⼀标识;同样是效率低。
(4) 分布式调度任务平台,解决了任务幂等问题,Job 负载均衡轮询机制(推荐)。
那么现在我们来总结下,⾸先传统的定时任务,⼏乎⽆法做到⾼可⽤,再加上项⽬部署集群,会导致任务幂等性问题;此时分布式定时任务调度平台便发挥了作⽤,咱们拿 XXL-Job 来进⾏说明;相关作⽤如下:(1) ⽀持Job集群,Job 负载均衡轮询机制保证幂等性问题。
(2) ⽀持Job补偿,如果Job执⾏失败的话,会⾃动实现重试机制,超过重启次数后,会发送邮件通知运维⼈员。
(3) ⽀持Job⽇志记录。
(4) 动态配置定时规则,传统定时Job触发规则都是写死在代码中。
XXL-JOB简介开源社区:环境:Maven3+Jdk1.8+Mysql5.7+xxl-job执⾏原理调度平台、执⾏器、任务管理,相关解释如下:调度平台:统⼀管理任务调度的平台,负责转发任务到对应的执⾏服务器。
XXL-JOB任务调度⽇常开发中难免会碰到需要开启定时任务处理业务。
这时我们第⼀时间想到的是Spring的Task,但是很不⽅便,这⾥可以列出⼏点: 1.⼀旦需要更改定时任务时间,我们就要打开IDE修改cron表达式; 2.在特殊的情况下代码报错了,我们就要打开Log查看是什么导致的问题; 3.需要很多定时任务去处理业务就要新建多个,突然不想执⾏这个任务了,我们就要再打开IDE注释那些代码。
就特别不好管理。
可能⼜有⼈要说了: 1.我可以⽤Redis进⾏动态修改cron表达式;--------看下⾯代码 2.我写个Aop,只要出现异常了我就记录相关信息;-------- ⽜掰!Aop固然好,但是你觉得真的⽅便了吗? 3.······我就是不闲⿇烦,咋地。
--------打扰了package cn.chenghao.config;import lombok.AllArgsConstructor;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.annotation.SchedulingConfigurer;import org.springframework.scheduling.config.ScheduledTaskRegistrar;import org.springframework.scheduling.support.CronTrigger;import javax.annotation.PostConstruct;/*** ⾃定义定时任务** @Author chenghao* @Date 2020/4/14 11:56**/@Configuration@EnableScheduling@AllArgsConstructorpublic class CompleteScheduleConfig implements SchedulingConfigurer {/*** StringRedis模板*/private final StringRedisTemplate stringRedisTemplate;/*** 初始化*/@PostConstructprivate void init() {// redis中不存在则创建stringRedisTemplate.opsForValue().setIfAbsent("cron", "0/3 * * * * ?");}/*** 配置任务*/@Overridepublic void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {// 给定cron表达式,触发Runnable任务scheduledTaskRegistrar.addTriggerTask(() -> {System.out.println("执⾏定时任务中.......");},triggerContext -> {// 获取cron表达式String cron = stringRedisTemplate.opsForValue().get("cron");// 返回执⾏周期return new CronTrigger(cron).nextExecutionTime(triggerContext);});}}!(真的是太⽅便了)----------------------------------好,废话不再多说----------------------------------XXL-JOB地址:概述:XXL-JOB是⼀个分布式任务调度平台,其核⼼设计⽬标是开发迅速、学习简单、轻量级、易扩展。
介绍⼀种很好⽤的任务调度平台1 总体设计分布式任务调度平台是什么XXL-JOB是⼀个轻量级分布式任务调度平台,和quartz相似,但是XXL-JOB将调度中⼼与执⾏器解耦,弥补了quartz的不⾜(使⽤API⽅式操作任务,不⼈性化;系统侵⼊性严重等)其核⼼设计⽬标是开发迅速、学习简单、轻量级、易扩展。
现已开放源代码并接⼊多家公司线上产品线,开箱即⽤。
⽂档我这边可以给。
源码⽬录介绍/xxl-job-admin :调度中⼼,项⽬源码/xxl-job-core :公共Jar依赖/xxl-job-executor-samples :执⾏器,Sample⽰例项⽬(⼤家可以在该项⽬上进⾏开发,也可以将现有项⽬改造-⽣成“调度数据库”配置XXL-JOB调度模块基于Quartz集群实现,其“调度数据库”是在Quartz的11张集群mysql表基础上扩展⽽成。
XXL-JOB⾸先定制了Quartz原⽣表结构前缀(XXL_JOB_QRTZ_)。
我们代码配置和源码配置⼀样在此基础上新增了⼏张张扩展表。
正常情况下总共16张表所有表(若想详细了解可以查看⽂档):架构设计设计思想“调度中⼼”负责发起调度请求。
“执⾏器”负责接收调度请求并执⾏对应的JobHandler 中业务逻辑。
系统组成调度模块(调度中⼼)负责管理调度信息,按照调度配置发出调度请求,⾃⾝不承担业务代码。
调度系统与任务解耦,提⾼了系统可⽤性和稳定性,同时调度系统性能不再受限于任务模块;⽀持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE 开发和任务报警等,所有上述操作都会实时⽣效,同时⽀持监控调度结果以及执⾏⽇志,⽀持执⾏器Failover 。
- XXL_JOB_QRTZ_TRIGGER_GROUP :执⾏器信息表,维护任务执⾏器信息;- XXL_JOB_QRTZ_TRIGGER_REGISTRY :执⾏器注册表,维护在线的执⾏器和调度中⼼机器地址信息;- XXL_JOB_QRTZ_TRIGGER_INFO :调度扩展信息表: ⽤于保存XXL-JOB 调度任务的扩展信息,如任务分组、任务名、机器地址、执⾏器、执⾏⼊参和报警邮件等等;- XXL_JOB_QRTZ_TRIGGER_LOG :调度⽇志表: ⽤于保存XXL-JOB 任务调度的历史信息,如调度结果、执⾏结果、调度⼊参、调度机器和执⾏器等等;- XXL_JOB_QRTZ_TRIGGER_LOGGLUE :任务GLUE ⽇志:⽤于保存GLUE 更新历史,⽤于⽀持GLUE 的版本回溯功能;执⾏模块(执⾏器)负责接收调度请求并执⾏任务逻辑。
分布式任务调度平台xxl-job定时任务调度:在某个时间点触发执⾏操作(CURD)。
分布式任务调度平台的使⽤场景:数据同步、交易信息(对账)、清除过期⽤户信息、定期发送报表、消息推送。
传统的定时任务与分布式定时任务的区别?传统的定时任务特征:单点系统(job没有集群)思考:如果job在⾼并发的情况下,导致job服务器宕机之后,这时候应该如何处理?1.定时任务和业务服务放在⽤⼀个jvm中(⼩项⽬)2.⼤型互联⽹公司定时任务代码执⾏与业务执⾏代码服务器都是分开的,都是独⽴的jvm。
3.定时任务服务器是否需要考虑⾼并发情况?需要,因为同⼀时间点可能执⾏多个任务。
间隔执⾏场景不需要,同时执⾏需要考虑⾼并发情况。
4.如果在⾼并发情况下,定时job宕机后,该如何处理(只有⼀台服务器的情况下) ?使⽤⼼跳检测监控⾃动重启、补偿机制,每个任务做⼀个标记。
定时任务在执⾏代码的时候突然报错了,该如何处理?⽇志记录错误,跳过当前错的任务,接着执⾏下⼀个任务。
在使⽤定时job扫描错误⽇志记录,进⾏补偿信息。
分布式定时任务特征:job使⽤集群。
产⽣问题:定时任务打成3个war包放在三个不同服务器上(8080、8081、8082)。
定时任务在每个war包中都是相同的,三台服务器启动之后,定时job会被重复执⾏3遍。
分布式领域中服务器集群的情况下,如何保证job的幂等性?1.使⽤zookeeper实现分布式锁⽅式,不推荐效率低。
2.在配置⽂件中加上打开定时job的开关8080 设置flag=true、8081 设置flag=false、8082设置 flag=false,这种⽅法不属于分布式了属于单点的系统,不推荐。
3.启动的时候使⽤数据库的唯⼀标⽰,不推荐效率低。
4.使⽤分布式任务调度平台xxl-job、Elastric-job(依赖于zk)、TBSchedule。
分布式任务调度平台优点xxl-job1.⽀持集群(保证幂等性问题)、job负载均衡轮询机制。
利⽤XXL-JOB实现灵活控制的分⽚处理本⽂讲述了⼀种利⽤ XXL-JOB 来进⾏分⽚任务处理的⽅法,另外加⼊对执⾏节点数的灵活控制。
场景现在⼀张数据表⾥有⼤量数据需要某个服务端应⽤来处理,要求:1. 能够并⾏处理;2. 能够较灵活地控制并⾏任务数量。
3. 压⼒较均衡地分散到不同的服务器节点;思路因为需要并⾏处理同⼀张数据表⾥的数据,所以⽐较⾃然地想到了分⽚查询数据,可以利⽤对 id 取模的⽅法进⾏分⽚,避免同⼀条数据被重复处理。
根据第 1、2 点要求,本来想通过对线程池的动态配置来实现,但结合第 3 点来考虑,服务器节点数量有可能会变化,节点之间相互⽆感知⽆通信,⾃⼰在应⽤内实现⼀套调度机制可能会很复杂。
如果有现成的独⽴于这些服务器节点之外的调度器就好了——顺着这个思路,就想到了已经接⼊的分布式任务调度平台 XXL-JOB,⽽在阅读其后发现「分⽚⼴播 & 动态分⽚」很贴合这种场景。
⽅案1. 利⽤ XXL-JOB 的路由策略「分⽚⼴播」来调度定时任务;2. 通过任务参数传⼊执⾏任务节点数量;3. 定时任务逻辑⾥,根据获取到的分⽚参数、执⾏任务节点数量,决策当前节点是否需要执⾏,分⽚查询数据并处理:如果分⽚序号 > (执⾏任务节点数量 - 1),则当前节点不执⾏任务,直接返回;否则,取分⽚序号和执⾏任务节点数量作为分⽚参数,查询数据并处理。
这样,我们可以实现灵活调度 [1, N] 个节点并⾏执⾏任务处理数据。
主要代码⽰例JobHandler ⽰例:@XxlJob("demoJobHandler")public void execute() {String param = XxlJobHelper.getJobParam();if (StringUtils.isBlank(param)) {XxlJobHelper.log("任务参数为空");XxlJobHelper.handleFail();return;}// 执⾏任务节点数量int executeNodeNum = Integer.valueOf(param);// 分⽚序号int shardIndex = XxlJobHelper.getShardIndex();// 分⽚总数int shardTotal = XxlJobHelper.getShardTotal();if (executeNodeNum <= 0 || executeNodeNum > shardTotal) {XxlJobHelper.log("执⾏任务节点数量取值范围[1,节点总数]");XxlJobHelper.handleFail();return;}if (shardIndex > (executeNodeNum - 1)) {XxlJobHelper.log("当前分⽚ {} ⽆需执⾏", shardIndex);XxlJobHelper.handleSuccess();return;}shardTotal = executeNodeNum;// 分⽚查询数据并处理process(shardIndex, shardTotal);XxlJobHelper.handleSuccess();}分⽚查询数据⽰例:select field1, field2from table_namewhere ...and mod(id, #{shardTotal}) = #{shardIndex}order by id limit #{rows};进⼀步思考1. 如果需要更⼤的并发量,需要有⼤于应⽤节点数量的任务并⾏,如何处理?两种思路:通过任务参数传⼊⼀个并发数,单个节点在处理任务时,将查询到的数据按这个数字进⾏再分⽚,交由线程池并⾏处理;配置 M 个定时任务,指定相同的 JobHandler,给它们编号 0、1、2...M,并将定时任务编号和 M 这两个数,由任务参数传⼊,定时任务逻辑⾥,先根据分⽚参数、定时任务编号、M,重新计算出新的分⽚参数,如分⽚序号 = (分⽚序号 * M) + 定时任务编号,分⽚总数 = 分⽚总数 * M,再查询数据并处理。
分布式定时任务调度系统技术解决⽅案(xxl-job、Elastic-job、Saturn)1.业务场景保险⼈管系统每⽉⼯资结算,平安有150万代理⼈,如何快速的进⾏⼯资结算(数据运算型)保险短信开门红/电商双⼗⼀ 1000w+短信发送(短时汇聚型)⼯作中业务场景⾮常多,所涉及到的场景也各不相同,这使得我们定时任务系统应该集管理、调度、任务分配、监控预警为⼀体的综合调度系统,如何打造⼀套健壮的、适应不同场景的系统,技术选型尤其重要。
针对以上场景我们需要我们的分布式任务系统具备以下能⼒:1.⽀持多种作业类型(shell作业/Java作业)2.⽀持作业HA,负载均衡和失败转移3.⽀持弹性扩容(应对开门红以及促销活动)4.⽀持Job Timeout 处理5.⽀持统⼀监控和告警6.⽀持作业统⼀配置7.⽀持资源隔离和作业隔离2.定时任务调度的特点任务调度就是设点某⼀时间点⾃动触发的任务,该任务可以在时间规律上去循环执⾏。
⼀般的技术quartz、spring task、java.util.Timer,这⼏种如果在单⼀机器上跑其实问题不⼤,但是如果⼀旦应⽤于集群环境做分布式部署,就会带来⼀个致命的特点:时间驱动:系统⼀般可以通过时间来驱动,定时定点定次。
批量处理:批量处理堆积的数据更加⾼效,在不需要实时性的情况下⽐消息中间件更有优势。
⽽且有的业务逻辑只能批量处理。
如对账批处理、资⾦管理系统回盘、部分银⾏的报盘前的制盘⾮实时性:定时任务不要求实时性,⼀般不⽤于C端⽤户的交互,更多的⽤于业务数据的处理隔离性/专⼀性:可以跟其他系统分离,只关注业务数据的处理,不影响⽤户的操作和⽤户系统的性能。
基本原理:3.开源定时任务框架Quartz:Java事实上的定时任务标准。
但Quartz关注点在于定时任务⽽⾮数据,并⽆⼀套根据数据处理⽽定制化的流程。
虽然Quartz可以基于数据库实现作业的⾼可⽤,但缺少分布式并⾏调度的功能。
elastic-job是一种分布式任务调度框架,可以在分布式系统中调度任务,其核心是ElasticJob控制台。
ElasticJob控制台主要用于监控、更改配置和暂停/启动定时任务,提供了安全控制、注册中心管理、定时任务维度状态查看、服务器维度状态查看、快捷修改定时任务配置、控制任务的暂停和恢复运行等功能。
ElasticJob提供了一些命令和脚本,可以简化任务调度,其中包括job:simple、job:dataflow、job:script、job:listener和reg:bean 等命名空间。
每个命名空间都有自己的特有属性,同时也继承了其他命名空间的基本属性。
安装ElasticJob时,需要注意zookeeper版本冲突、多版本并存、maven仓库缺失jar包、源码打包失败等问题,并给出了解决方案。
同时,ElasticJob也可以与其他组件集成,例如和Spring框架一起使用。
在使用ElasticJob的过程中,也有一些值得注意的事项。
例如,为了避免任务冲突,需要使用相同的jobKey和jobName。
为了处理失败的任务,需要设置一些重试策略。
此外,还需要设置合适的并发限制,以确保任务的正常运行。
总的来说,ElasticJob是一个灵活、易用的分布式任务调度框架,能够帮助开发者快速构建高性能、高可靠的分布式系统。
使用ElasticJob控制台可以进行查看作业以及服务器状态、快捷修改以及删除作业、设置启用和禁用作业、跨注册中心查看作业、查看作业运行轨迹和运行状态等操作。
同时,ElasticJob也提供了丰富的特性,例如支持多种任务调度模式、支持多种消息传递机制、支持多种执行引擎等等,可以满足不同场景的需求。
《分布式任务调度平台XXL-JOB》手册文档历史记录目录1:简介 (3)2:安装 (3)3:配置 (3)3.1数据库准备 (4)3.2源码准备 (5)3.3部署准备 (5)3.3.1 配置部署“调度中心” (5)3.3.2 配置部署“执行器项目” (7)4:使用 (9)步骤一:新建任务 (9)步骤二:“GLUE模式(Java)”任务开发 (10)步骤三:触发执行 (10)步骤四:查看日志 (10)5:总结 (11)1:简介XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展,XXL-JOB是基于开源Quartz 调度核的、为方便企业调度场景而开源的一款实用的调度工具。
自带任务配置页面,任务监控,分布式执行器等功能。
2:安装下载地址(最新1.9版本迭代中,可选择稳定版本1.8.2下载)码云:https://gitee./xuxueli0323/xxl-job/tree/v1.8.23:配置解压下载文件,得到如下文件结构,- /doc :文档资料- /db :“调度数据库”建表脚本- /xxl-job-admin :调度中心,项目源码- /xxl-job-core :公共Jar依赖- /xxl-job-executor-samples :执行器,Sample示例项目3.1数据库准备使用mysql 新建数据库xxl-job ,导入下载文件夹中/doc/db/tables_xxl_job.sql 文件,应生成16表,如图所示。
3.2源码准备按照maven格式将源码导入IDE,使用maven进行编译即可,源码结构如下xxl-job-admin:调度中心xxl-job-core:公共依赖xxl-job-executor:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器):xxl-job-executor-sample-spring:Spring版本,通过Spring容器管理执行器,比较通用;:xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器;:xxl-job-executor-sample-jfinal:JFinal版本,通过JFinal管理执行器;:xxl-job-executor-sample-nutz:Nutz版本,通过Nutz管理执行器;3.3部署准备3.3.1 配置部署“调度中心”调度中心项目:xxl-job-admin作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。
分布式任务调度平台XXL-JOB搭建教程 关于分布式任务调度平台XXL-JOB,其实作者许雪⾥在其发布的中已经介绍的很清楚了,这⾥我就不做过多的介绍了,关于其搭建教程,本⼈依照其⽂档搭建起来基本上也没遇到啥问题,这⾥通过博客的形式记录下来。
1、源码下载地址 ①、GitHub: ②、码云:2、⽂档地址 ①、中⽂⽂档: ②、英⽂⽂档:3、源码结构 通过上⾯给出的源码下载地址,我们将源码clone到IDEA中,如下:4、初始化数据库 初始化脚本在上⾯源码⽬录的 /doc/db/tables_xxl_job.sql ,将此脚本在MySQL数据库中执⾏⼀遍。
执⾏完毕,会在MySQL数据库中⽣成如下 16 张表:5、配置调度中⼼ 调度中⼼就是源码中的 xxl-job-admin ⼯程,我们需要将其配置成⾃⼰需要的调度中⼼,通过该⼯程我们能够以图形化的⽅式统⼀管理任务调度平台上调度任务,负责触发调度执⾏。
①、修改调度中⼼配置⽂件 ⽂件地址:/xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties 配置⽂件说明:1 ### 1、调度中⼼项⽬的端⼝号以及访问路径2 server.port=80803 server.context-path=/xxl-job-admin45 ### 2、配置静态⽂件的前缀6 spring.mvc.static-path-pattern=/static/**7spring.resources.static-locations=classpath:/static/89### 3、配置模板⽂件10spring.freemarker.templateLoaderPath=classpath:/templates/11spring.freemarker.suffix=.ftl12spring.freemarker.charset=UTF-813spring.freemarker.request-context-attribute=request14spring.freemarker.settings.number_format=0.##########1516### 4、配置mybatis的mapper⽂件地址17mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml1819### 5、配置数据库的地址20spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-job?Unicode=true&characterEncoding=UTF-8ername=root22spring.datasource.password=root_pwd23spring.datasource.driver-class-name=com.mysql.jdbc.Driver2425spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource26spring.datasource.tomcat.max-wait=1000027spring.datasource.tomcat.max-active=3028spring.datasource.tomcat.test-on-borrow=true29spring.datasource.tomcat.validation-query=SELECT 130spring.datasource.tomcat.validation-interval=300003132### 6、配置报警邮箱33spring.mail.host=34spring.mail.port=25ername=xxx@36spring.mail.password=xxx37spring.mail.properties.mail.smtp.auth=true38spring.mail.properties.mail.smtp.starttls.enable=true39spring.mail.properties.mail.smtp.starttls.required=true404142### 7、管理界⾯的登录⽤户名密码ername=admin44xxl.job.login.password=1234564546### 8、调度中⼼通讯TOKEN,⾮空时启⽤47xxl.job.accessToken=4849### 9、调度中⼼国际化设置,默认为中⽂版本,值设置为“en”时切换为英⽂版本50xxl.job.i18n= 注意:基本上上⾯的配置⽂件我们需要修改的只有第 5 点,修改数据库的地址,这要与我们前⾯初始化的数据库名称径,⽤户名密码保持⼀致; 第⼆个就是修改第 6 点,报警邮箱,因为该⼯程任务失败后有失败告警功能,可以通过邮件来提醒,如果我们需要此功能,可以配置⼀下。
xxl-job原理
XXL-JOB是一款轻量级开源的分布式任务调度框架,xxl-job节点划分为"执行器"与"调度器"两大模块,服务间无状态,执行器与调度器可以异机部署。
执行器是一种基本的任务执行服务,执行器上的任务是以"插件化"的方式,通过java jar文件部署在执行器上,当调度器需要请求执行任务时,执行器就会将任务部署在指定的机器上执行。
调度器通过RESTful API(REST非对称API)向下游提供服务,调度器可以根据不同的应用需求,自定义调度任务的触发时机,比如一秒执行一次,一小时执行一次,每分钟执行一次等,同时也可以支持定时,定点,指定间隔执行,秒级任务、分级任务、小时级任务,日级任务等等。
XXL-JOB还支持分布式、HA部署,多台服务器节点间互相通信,扩展性也很强,可以扩展更多更复杂的特性,如URL参数调度、多租户数据分隔等。
XXL-JOB还支持任务调度的"可视化配置"管理,便于操作人员将任务部署到不同的执行器上,以流程的方式进行管理,让运维的任务更加轻松和高效。
另外,XXL-JOB还提供了用户可视化端,可以根据任务的运行状态、任务的运行时间等信息,以及实时任务的监控,便于用户对任务进行更好的管理,快速找出任务出现的问题,以实现自动化管理。
分布式任务调度平台XXL-JOB《分布式任务调度平台XXL-JOB》[TOCM][TOC]⼀、简介1.1 概述XXL-JOB是⼀个分布式任务调度平台,其核⼼设计⽬标是开发迅速、学习简单、轻量级、易扩展。
现已开放源代码并接⼊多家公司线上产品线,开箱即⽤。
1.2 社区交流1.3 特性1、简单:⽀持通过Web页⾯对任务进⾏CRUD操作,操作简单,⼀分钟上⼿;2、动态:⽀持动态修改任务状态、启动/停⽌任务,以及终⽌运⾏中任务,即时⽣效;3、调度中⼼HA(中⼼式):调度采⽤中⼼式设计,“调度中⼼”⾃研调度组件并⽀持集群部署,可保证调度中⼼HA;4、执⾏器HA(分布式):任务分布式执⾏,任务"执⾏器"⽀持集群部署,可保证任务执⾏HA;5、注册中⼼: 执⾏器会周期性⾃动注册任务, 调度中⼼将会⾃动发现注册的任务并触发执⾏。
同时,也⽀持⼿动录⼊执⾏器地址;6、弹性扩容缩容:⼀旦有新执⾏器机器上线或者下线,下次调度时将会重新分配任务;7、路由策略:执⾏器集群部署时提供丰富的路由策略,包括:第⼀个、最后⼀个、轮询、随机、⼀致性HASH、最不经常使⽤、最近最久未使⽤、故障转移、忙碌转移等;8、故障转移:任务路由策略选择"故障转移"情况下,如果执⾏器集群中某⼀台机器故障,将会⾃动Failover切换到⼀台正常的执⾏器发送调度请求。
9、阻塞处理策略:调度过于密集执⾏器来不及处理时的处理策略,策略包括:单机串⾏(默认)、丢弃后续调度、覆盖之前调度;10、任务超时控制:⽀持⾃定义任务超时时间,任务运⾏超时将会主动中断任务;11、任务失败重试:⽀持⾃定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进⾏重试;其中分⽚任务⽀持分⽚粒度的失败重试;12、任务失败告警;默认提供邮件⽅式失败告警,同时预留扩展接⼝,可⽅便的扩展短信、钉钉等告警⽅式;13、分⽚⼴播任务:执⾏器集群部署时,任务路由策略选择"分⽚⼴播"情况下,⼀次任务调度将会⼴播触发集群中所有执⾏器执⾏⼀次任务,可根据分⽚参数开发分⽚任务;14、动态分⽚:分⽚⼴播任务以执⾏器为维度进⾏分⽚,⽀持动态扩容执⾏器集群从⽽动态增加分⽚数量,协同进⾏业务处理;在进⾏⼤数据量业务操作时可显著提升任务处理能⼒和速度。
xxl-job设计思想⼀、简介XXL-JOB是⼀个分布式任务调度平台,其核⼼设计⽬标是开发迅速、学习简单、轻量级、易扩展。
现已开放源代码并接⼊多家公司线上产品线,开箱即⽤。
⼆、源码地址:结构xxl-job-admin:调度中⼼ xxl-job-core:公共依赖 xxl-job-executor-samples:执⾏器Sample⽰例(选择合适的版本执⾏器,可直接使⽤,也可以参考其并将现有项⽬改造成执⾏器):xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执⾏器,推荐这种⽅式;:xxl-job-executor-sample-frameless:⽆框架版本;三、Springboot如何整合xxl-job1. 初始化调度数据库//源码地址: /xxl-job/doc/db/tables_xxl_job.sql2. Maven依赖3. 配置⽂件信息:端⼝,地址,数据库连接,线程池,国际化,token认证,报警邮件服务端等等4. 配置XxlJobConfig:注解⽅式或者继承类⽅式5. 创建Handler接⼝:具体任务的业务逻辑四、xxl-job架构思想1. 将调度⾏为抽象为调度中⼼公共平台,⽽平台本⾝不承担业务逻辑,调度中⼼负责发送调度请求。
2. 将任务抽象成分散的JobHandler,交由执⾏器统⼀管理,执⾏器负责接收调度请求,并且执⾏对应的业务逻辑,调度和任务完全解耦。
3. 调度和任务完全解耦,提⾼了系统稳定性和扩展性。
4. 其中调度中⼼⽀持可视化的动态管理调度信息,包括任务和执⾏器的curd,GLUC开发,报警信息配置,调度机制:轮询,第⼀个,最后⼀个,随机性,⼀致性Hash等算法等,所有操作实时⽣效,同事⽀持调度中⼼⽇志查看和操作,执⾏器的状态和⽇志查看。
5.架构图五、总结常⽤的定时任务以及分布式框架实现:1. while (true) + 线程休眠通过轮询+线程休眠实现定时任务。