XXL-JOB任务调度平台 官网
https://www.xuxueli.com/xxl-job/
中文文档
https://www.xuxueli.com/xxl-job/
源码仓库地址
https://github.com/xuxueli/xxl-jobhttp://gitee.com/xuxueli0323/xxl-job
下载地址
https://github.com/xuxueli/xxl-job/releaseshttps://gitee.com/xuxueli0323/xxl-job/releases
中央仓库地址
<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${最新稳定版本}</version>
</dependency>
1.传统任务调度存在的缺陷
- 业务逻辑与定时任务逻辑放入在同一个Jar包中,如果定时任务逻辑挂了也会影响到业务逻辑;
- 如果服务器集群的情况下,可能存在定时任务逻辑会重复触发执行;
- 定时任务执行非常消耗cpu的资源,可能会影响到业务线程的执行
2.如何在集群中,保证我们的定时任务只会触发一次
- 将业务逻辑和定时任务逻辑完全分开部署,实现解耦、只对业务逻辑实现集群,不对我们的定时任务逻辑集群;—定时任务
单机部署
版本
问题:如果宕机,如何保证高可用?
- 对我们Jar包加上一个
开关
,项目启动的时候读取该开关 如果为true的情况下则加载定时任务类,否则情况下就不加载该定时任务类; - 在
数据库
加上一个主键
能够创建成功,则触发定时任务,否则就不触发定时任务; 分布式锁
实实现,只要jar能够拿到分布式锁就能够执行定时任务,否则情况下不执行;
以上的方案都是属于规模比较小的项目
,在微服务架
构中应该采用分布式任务调度平台
。
3. 传统定时任务的实现方案
1.多线程形式
每隔1s打印一句话
2.timetask
3.quartz
public class QuartzTest {
public static void main(String[] args) throws SchedulerException {
//1.创建Scheduler的工厂
SchedulerFactory sf = new StdSchedulerFactory();
//2.从工厂中获取调度器实例
Scheduler scheduler = sf.getScheduler();
//3.创建JobDetail
JobDetail jb = JobBuilder.newJob(MyJob.class)
.withDescription("this is a ram job") //job的描述
.withIdentity("ramJob", "ramGroup") //job 的name和group
.build();
//任务运行的时间,SimpleSchedle类型触发器有效
long time = System.currentTimeMillis() + 3 * 1000L; //3秒后启动任务
Date statTime = new Date(time);
//4.创建Trigger
//使用SimpleScheduleBuilder或者CronScheduleBuilder
Trigger t = TriggerBuilder.newTrigger()
.withDescription("")
.withIdentity("ramTrigger", "ramTriggerGroup")
//.withSchedule(SimpleScheduleBuilder.simpleSchedule())
.startAt(statTime) //默认当前时间启动
.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) //两秒执行一次
.build();
//5.注册任务和定时器
scheduler.scheduleJob(jb, t);
//6.启动 调度器
scheduler.start();
}
}
public class MyJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("quartz MyJob date:" + new Date().getTime());
}
}
4.springboot注解形式
@Componentpublic class UserScheduled {
@Scheduled(cron = "0/1 * * * * *")
public void taskUserScheduled() {
System.out.println("定时任务触发...");
}
}
5.线程池
5.分布式任务调度架构设计原理
定时任务和业务逻辑分开,实现解偶。
6.搭建
自动注册:
等待几秒
手动注册:
定时执行