一、定时任务应用场景
- 订单超时自动取消、支付倒计时
- 优惠券发放
- 物流信息推送、退换货处理
- 数据积压监控、日志监控、服务可用性探测
- 定时备份数据
- 数据归档、清理
- 定时结算
二、定时任务实现方式
- Timer
- Quartz
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
public class MySchedule {
public static Scheduler createScheduler() throws SchedulerException {
StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
return scheduler;
}
public static JobDetail createJob(){
JobBuilder jobBuilder = JobBuilder.newJob(MyJob.class);
JobDetail myJob = jobBuilder.withIdentity("name","myJob").build();
return myJob;
}
public static CronTrigger createCron(){
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
.withIdentity("name", "myTrigger")
.startNow()
.withSchedule(CronScheduleBuilder.cronSchedule("*/2 * * * * ?")).build();
return cronTrigger;
}
public static void main(String[] args) throws SchedulerException {
Scheduler scheduler = MySchedule.createScheduler();
scheduler.scheduleJob(MySchedule.createJob(),MySchedule.createCron());
scheduler.start();
}
}
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("发工资了....");
}
}
- ElasticJob(当当):专业的分布式调度框架,轻量级无中心化,elastic-job-lite
发现已经托管给apache了elasticJob
<dependency>
<groupId>org.apache.shardingsphere.elasticjob</groupId>
<artifactId>elasticjob-lite-core</artifactId>
<version>3.0.0-beta</version>
</dependency>
三、何为分布式调度
两层意思:
1)任务分片:一个大任务拆分成多个小任务,在多个应用实例上同时执行。如对一千万用户定时发放优惠券,可拆分成100个小任务同时执行;
2)任务部署在分布式应用中,同一时刻只有一个应用实例执行该任务,不会出现任务重复执行的情况;如订单模块部署了两台服务器,统计订单报表的定时任务只会在其中一台上执行
四、常见分布式调度框架对比
对比内容 | xxl-job | elastic-job-lite | quartz |
---|---|---|---|
作者 | 大众点评许雪里 | 当当 | 1、无控制台; |
文档 | https://www.xuxueli.com/xxl-job/ | https://shardingsphere.apache.org/elasticjob/current/cn/overview/ | 2、调用API的方式操作任务 |
中心化 | 是 | 轻量级无中心化,基于Quartz二次开发 | 3、需要将Quartz的表侵入到工程中 |
部署依赖 | 无 | zookeeper | 4、关注点在于定时任务而非分布式调度 |
弹性扩容缩容 | 一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务; | 集群中增减实例,任务会重新均匀分配 | |
失效转移 | 一次完整任务流程包括”调度(调度中心) + 执行(执行器)”两个阶段。 | 在开启失效转移功能之后,ElasticJob 的其他服务器能够在感知到宕机的作业服务器之后,补偿执行该分片作业。在资源充足的情况下,作业能够按时执行完成。 | |
动态分片 | 支持 | 默认是平均去分,可以自定义 | |
管控台 | https://www.xuxueli.com/xxl-job/ 文档1.5下载部署到tomcat即可 | https://github.com/apache/shardingsphere-elasticjob-ui/blob/master/README_ZH.md | |
链接:https://pan.baidu.com/s/1kita8Buxd4vGHtCIGW4mXg 提取码:09mg |