遇到定时任务相关,专业白嫖B站《【千锋】2020年-Ja-va-Quartz教程》,记录一下学习过程,一天肯定是搞不定的,持续更新吧,最后也发现千峰的好像少一点深度,《2021最新版springboot整合quartz,quartz集群教程》也需要一看。
Maven依赖引入
从maven的仓库可以很简单的查到相关的依赖
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
Hello工程
Quatrz最重要的三个概念
(1)调度器 相当于天猫精灵的实体,用于根据给定的定时策略执行给定的定时任务
(2)任务 相当于给天猫精灵下发的指令,比如叫我吃饭,提醒我喝水等
(3)触发器 相当于下发的策略,即 几点
简单的Hello工程如下:
// 继承Job,写任务需要做什么
@Slf4j
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDetail detail = jobExecutionContext.getJobDetail();
log.info("job name:{},job group:{},job data:{}",
detail.getKey().getName(),
detail.getKey().getGroup(),
detail.getJobDataMap().getString("data"));
}
}
调度器和触发器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 调度器
TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger(); // 触发器 什么时候执行与执行的策略
Trigger trigger = triggerBuilder.withIdentity("trigger1", "group1").startNow().
withSchedule(SimpleScheduleBuilder.
simpleSchedule().
withIntervalInSeconds(2).
repeatForever()).build();
// 将任务加进来
JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job04","group04").
usingJobData("data","testJob04").build();
// 调度器执行,此处一直没有停止调度器
scheduler.scheduleJob(job,trigger);
scheduler.start();
多种触发器
触发器有很多种,常用的接口如下:
SimpleTrigger已经在Hello工程中使用:
间隔只有小时、分钟和秒
SimpleScheduleBuilder.
simpleSchedule().
withIntervalInSeconds(2).
repeatForever()
CalendarIntervalTrigger:按照日历执行,仅简单触发器需要些repeatForever或者是否一直执行
CalendarIntervalScheduleBuilder.calendarIntervalSchedule().withIntervalInWeeks(1)
DailyTimeIntervalTrigger
DailyTimeIntervalScheduleBuilder.dailyTimeIntervalSchedule()
.startingDailyAt(TimeOfDay.hourAndMinuteOfDay(9,10))
.endingDailyAt(TimeOfDay.hourAndMinuteOfDay(9,30))
.onDaysOfTheWeek(DateBuilder.MONDAY,DateBuilder.THURSDAY)
.withIntervalInHours(2).withRepeatCount(10)
CronTrigger
类似于Linux的crontab定时任务,可以使用注解的方式
并发
(1)同一个任务,间隔时间短,任务执行周期长的时,会重启起一个任务,再次执行这个任务,如果想等本次执行完成,则需要在Job上增加@DisallowConcurrentExecution注解,即同一Job,未执行完时,间隔时间又到时,会等待执行完成后,再次执行
(2)添加很多的任务,都并发,如何防止任务的并发爆炸呢
org.quartz.threadPool.threadCount=50 即最多50个任务,包含所有,即同一Job如果允许并发运行,是可能会超出的
持久化
持久化请参考:https://blog.csdn.net/Elliottx/article/details/78904247
集群
Quartz与@Schedule的比较
(1)Quartz支持集群