實戰程式碼(一):SpringBoot整合Quartz
一、簡單介紹
Quartz 是一個完全由 Java 編寫的開源作業排程框架,可以由少量的程式碼實現較為複雜的功能。
Springboot內建的task雖然也可以實現定時任務,但是它預設單執行緒,雖然可以通過配置實現多執行緒,但是功能略顯單薄。
Quartz有著強大的任務管理功能,可以在執行時進行任務的開啟、關閉、修改任務執行時間等。
二、開發
2.1 依賴引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2.2 配置檔案
spring:
main:
banner-mode: off
quartz:
job-store-type: memory
scheduler-name: smile-scheduler
properties:
org:
quartz:
jobStore:
threadPool:
# 執行緒個數
threadCount: 10
注:如需將job資訊持久化到db,可參考官方文件進行配置
2.3 實現Job
/**
* 定時任務demo
* - @DisallowConcurrentExecution 當前任務未執行完前不會執行新的任務
* @author smile
*/
@Slf4j
@DisallowConcurrentExecution
public class QuartzDemoJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
// todo something
log.info("!!!開始執行--測試定時任務");
}
}
2.4 工具類
/**
* quartz任務管理
* - Group統一使用quartz預設的組
* @author smile
*/
@Component
public class QuartzUtils {
@Autowired
private Scheduler scheduler;
/**
* 新增任務--SimpleScheduler
* @param jobClass jobClass
* @param taskName jobName、triggerName使用同一個name
* @param intervalTime 間隔時間, 單位:秒
*/
public void addSingleJob(Class<? extends Job> jobClass, String taskName, int intervalTime) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(jobClass)
.withIdentity(taskName).build();
SimpleScheduleBuilder simpleScheduler = SimpleScheduleBuilder.simpleSchedule()
.withMisfireHandlingInstructionNextWithRemainingCount();
Trigger trigger = TriggerBuilder.newTrigger()
.startAt(new Date(System.currentTimeMillis() + 1000 * 10))
.withIdentity(taskName)
.withSchedule(
simpleScheduler.withIntervalInSeconds(intervalTime).repeatForever())
.build();
scheduler.scheduleJob(jobDetail, trigger);
}
/**
* 新增任務--cron
* @param jobClass jobClass
* @param taskName jobName、triggerName使用同一個name
* @param cron cron定時任務規則
*/
public void addCronJob(Class<? extends Job> jobClass, String taskName, String cron) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(jobClass)
.withIdentity(taskName).build();
CronScheduleBuilder cronScheduler = CronScheduleBuilder.cronSchedule(cron).withMisfireHandlingInstructionDoNothing();
Trigger trigger = TriggerBuilder.newTrigger().startNow().withIdentity(taskName)
.withSchedule(cronScheduler)
.build();
scheduler.scheduleJob(jobDetail, trigger);
}
/**
* 修改cron規則
*/
public void modifyCron(String taskName, String cron) throws SchedulerException {
TriggerKey triggerKey = TriggerKey.triggerKey(taskName);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
String oldTime = trigger.getCronExpression();
if(!oldTime.equalsIgnoreCase(cron)){
CronScheduleBuilder cronBuilder = CronScheduleBuilder.cronSchedule(cron);
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
triggerBuilder.withIdentity(taskName).startNow().withSchedule(cronBuilder);
trigger = (CronTrigger) triggerBuilder.build();
scheduler.rescheduleJob(triggerKey, trigger);
}
}
/**
* 刪除任務
*/
public void delJob(String taskName) throws SchedulerException {
TriggerKey triggerKey = TriggerKey.triggerKey(taskName);
JobKey jobKey = JobKey.jobKey(taskName);
scheduler.pauseTrigger(triggerKey);
scheduler.unscheduleJob(triggerKey);
scheduler.deleteJob(jobKey);
}
}
2.5 初始化定時任務
/**
* 初始化定時任務
* @author smile
*/
@Component
public class QuartzJobInit implements CommandLineRunner {
@Autowired
private QuartzUtils quartzUtils;
@Override
public void run(String... args) throws Exception {
// 每十秒執行一次
quartzUtils.addSingleJob(QuartzDemoJob.class, "demo-job", 10);
}
}
2.6 原始碼地址
https://github.com/lysmile/spring-boot-demo/tree/master/spring-boot-quartz-demo
附:Crontab例項
# 每分鐘的第0秒執行
0 */1 * * * ?
# 每隔5秒執行一次
*/5 * * * * ?
# 每天23:00:00執行
0 0 23 * * ?
# 每天凌晨1點執行
0 0 1 * * ?
# 每月1號凌晨0點執行
0 0 0 1 * ?
# 每月最後一天23點執行一次
0 0 23 L * ?
# 每週的星期天凌晨0點實行一次
0 0 0 ? * 1
# 每個小時的10分、20分、30分分別執行一次
0 10,20,30 * * * ?
# 每天的0點、1點、2點分別執行
0 0 0,1,2 * * ?
相關文章
- 【Springboot】快速整合QuartzSpring Bootquartz
- SpringBoot 整合 Quartz + MySQLSpring BootquartzMySql
- SpringBoot整合Quartz定時任務Spring Bootquartz
- Springboot 整合 Netty 實戰Spring BootNetty
- SpringBoot整合Redis實戰Spring BootRedis
- springboot整合Quartz實現動態配置定時任務Spring Bootquartz
- SpringBoot 實戰 (十二) | 整合 thymeleafSpring Boot
- SpringBoot整合kafka全面實戰Spring BootKafka
- SpringBoot 實戰 (九) | 整合 MybatisSpring BootMyBatis
- SpringBoot整合Quartz實現動態修改定時任務間隔Spring Bootquartz
- SpringBoot 實戰 (十三) | 整合 MyBatis (XML 版)Spring BootMyBatisXML
- SpringBoot整合Kafka的實戰用法大全Spring BootKafka
- springboot整合swagger實戰(基礎版)Spring BootSwagger
- SpringBoot整合RabbitMQ之典型應用場景實戰一Spring BootMQ
- Quartz - Spring和Quartz的整合quartzSpring
- 【FastDFS】SpringBoot整合FastDFS實戰,我只看這一篇!!ASTSpring Boot
- SpringBoot整合任務排程框架Quartz及持久化配置Spring Boot框架quartz持久化
- SpringBoot 實戰 (十七) | 整合 WebSocket 實現聊天室Spring BootWeb
- Quartz - Spring整合Quartz實現叢集的定時任務quartzSpring
- SpringBoot 實戰 (十一) | 整合資料快取 CacheSpring Boot快取
- SpringBoot整合RabbitMQ實戰附加死信交換機Spring BootMQ
- MyBatis初級實戰之三:springboot整合druidMyBatisSpring BootUI
- spring-quartz整合Springquartz
- 實戰程式碼(二):Springboot Batch實現定時資料遷移Spring BootBAT
- SpringBoot整合RabbitMQ之典型應用場景實戰二Spring BootMQ
- SpringBoot整合MyBatis-Plus框架(程式碼生成器)Spring BootMyBatis框架
- MongoDB 整合SpringBoot實踐MongoDBSpring Boot
- 如何實現Spring Boot和Quartz整合? - Nguyen Phuc HaiSpring BootquartzAI
- Quartz.NET整合UI版quartzUI
- springboot的netty程式碼實操Spring BootNetty
- SpringBoot整合mybatis-plus,pagehelper以及程式碼自動生成Spring BootMyBatis
- springboot專案整合quartz動態建立,停止,恢復,刪除定時任務,整合swagger3.0Spring BootquartzSwagger
- 從程式碼到部署微服務實戰(一)微服務
- Grails整合Quartz外掛實現定時任務(Job)AIquartz
- springboot整合jetcache實際操作Spring Boot
- SpringBoot 實踐系列-整合 RocketMQSpring BootMQ
- 實戰SpringBoot AdminSpring Boot
- SpringBoot整合MongoDB(實現一個簡單快取)Spring BootMongoDB快取