单机:Timer、ExectorService、spring@scheduled
分布式:xxl-job、quartz、elastic-job
由调度中心和执行器组成,调度中心提供一个web管理配置任务和执行器,调度中心通过rpc触发执行器
1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;
3、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;
4、故障转移:任务路由策略选择”故障转移”情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。
6、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性,一次任务调度只会触发一次执行
7、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件;
8、任务进度监控:支持实时监控任务进度;
xxl-job调度中心配置内容说明:
执行器配置:
@BeanpublicXxlJobSpringExecutorxxlJobExecutor(){logger.info(">>>>>>>>>>>xxl-jobconfiginit.");XxlJobSpringExecutorxxlJobSpringExecutor=newXxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appname);xxlJobSpringExecutor.setAddress(address);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);returnxxlJobSpringExecutor;}阻塞处理策略1.单机串行(默认)调度请求进入单机执行器后,调度请求进入队列并以串行方式运行(上一次还没执行完毕,后面的排队等待)
调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败
调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务
路由策略,核心就是xxljob到底去哪台服务器找任务执行
当选择该策略时,会选择执行器注册地址的第一台机器执行,如果第一台机器出现故障,则调度任务失败。
使用注册地址列表中的第一个address
当选择该策略时,会选择执行器注册地址的最后一台机器执行,如果机器出现故障,则调度任务失败。
当选择该策略时,会按照执行器注册地址轮询分配任务,如果其中一台机器出现故障,调度任务失败,任务不会转移
分组下机器地址相同,不同JOB均匀散列在不同机器上,保证分组下机器分配JOB平均;且每个JOB固定调度其中一台机器;
当选择该策略时,每个任务按照Hash算法固定选择某一台机器。如果那台机器出现故障,调度任务失败,任务不会转移。
对每一个使用的地址进行保存次数,之后按照次数进行从小到大的排序,取出次数小的进行使用,再给当前次数加一,一直这样操作
将好久不使用的排到最前面
当选择该策略时,按照顺序依次进行心跳检测,如果其中一台机器出现故障,则会转移到下一个执行器,若心跳检测成功,会选定为目标执行器并发起调度
当要执行的机器正忙(无可执行线程/需要排队),则使用下一个address执行。
当选择该策略时,按照顺序依次进行空闲检测,如果其中一台机器出现故障,则会转移到下一个执行器,若空闲检测成功,会选定为目标执行器并发起调度。
@XxlJob("testDemo2")publicReturnTtestDemo2(){//index:当前分片序号(从0开始),执行器集群列表中当前执行器的序号intindex=XxlJobHelper.getShardIndex();//total:总分片数,执行器集群的总机器数量inttotal=XxlJobHelper.getShardTotal();List
父子任务,是指父任务执行后会自动调用子任务,完成一种类似于链式的调用,在使用时只需要配置子任务的ID即可
@XxlJob("paramTask")publicReturnTparamTask(){XxlJobHelper.log("paramTask的定时任务开始");//单个参数Stringparam=XxlJobHelper.getJobParam();if(StringUtils.isNotBlank(param)){log.info("单个参数:{}",param);//多个参数String[]params=param.split(",");log.info("第一个参数:{}",params[0]);log.info("第二个参数:{}",params[1]);}//返回参数可用于查看结果、执行成功数等XxlJobHelper.handleSuccess("成功");returnReturnT.SUCCESS;}日志回调指执行器在执行任务时可以将执行日志传递给调度中心,即使任务没有执行完成,调度中心也可以看到回调的调度日志内容。更细化的分析任务执行情况
@XxlJob("logbackTask")publicReturnTlogbackTask()throwsInterruptedException{XxlJobHelper.log("当前程序执行到了:{}行",156);Thread.sleep(5000);XxlJobHelper.log("当前程序执行到了:{}行",200);Thread.sleep(5000);XxlJobHelper.log("当前程序执行完成");XxlJobHelper.handleSuccess("成功");returnReturnT.SUCCESS;}任务的生命周期xxl-job支持在调用任务时,第一次调用时先执行指定的方法,然后在执行具体的任务,当执行器停止时会执行指定的方法
@XxlJob(value="lifeCycleTask",init="startInit",destroy="destroy")publicReturnTlifeCycleTask()throwsInterruptedException{log.info("==============生命周期演示============");XxlJobHelper.handleSuccess("成功");returnReturnT.SUCCESS;}publicvoidstartInit(){log.info("第一次调用当前任务时,才会执行,预处理");}publicvoiddestroy(){log.info("当执行器停止时才会执行");}XXL-JOB缺点“调度中心”通过DB锁的形式来保证集群分布式调度的一致性,如果耗时较小的短调度任务很多,随着调度中心集群数量增加,会增大DB的压力,数据库的锁竞争会比较厉害,造成数据库压力,性能下降。