以Springboot為例介紹通過Quartz作業調度框架實現定時任務。
1、引用Quartz依賴
<!--引入Quartz-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
2、實現具體的可執行的調度任務類,調度任務類需實現Quartz框架提供的Job接口。
@Override
public void execute(JobExecutionContext jobExecutionContext) {
//獲取JobDetail中的JobDataMap
JobDataMap jobDetailMap = jobExecutionContext.getJobDetail().getJobDataMap();
for(Entry<String, Object> objectEntry: jobDetailMap.entrySet()){
System.out.println("jobDetailMap---"+objectEntry.getKey()+" "+objectEntry.getValue());
}
//獲取trigger中的JobDataMap
JobDataMap triggerMap = jobExecutionContext.getTrigger().getJobDataMap();
for(Entry<String, Object> objectEntry: triggerMap.entrySet()){
System.out.println("triggerMap---"+objectEntry.getKey()+" "+objectEntry.getValue());
}
//獲取trigger和JobDetail中的JobDataMap總和,如果有同一個key,則后者會將前者覆蓋
JobDataMap allMap = jobExecutionContext.getMergedJobDataMap();
for(Entry<String, Object> objectEntry: allMap.entrySet()){
System.out.println("allMap"+objectEntry.getKey()+" "+objectEntry.getValue());
}
}
3、實現任務調度邏輯,使用@PostConstruct使此定時任務在項目啟動時即開始運行。
@PostConstruct
public void buildQuartz(){
JobBuilder jobBuilder = JobBuilder.newJob(QuartzService.class).withIdentity(jobName,jobGroupName);
jobBuilder.usingJobData("jobDetail參數","jobDetail值");
JobDetail jobDetail = jobBuilder.build();
/*
* 按照指定間隔時間執行
* startNow()馬上執行
* withIntervalInSeconds(1) 按秒循環,1s循環一次
* repeatForever() 永遠循環
* */
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName,triggerGroupName)
.startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
.build();
//表達式調度構建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/3 * * * * ? *")
.withMisfireHandlingInstructionDoNothing();
/*
* 按照cron格式 定時執行
* */
Trigger triggerCron = TriggerBuilder.newTrigger().withIdentity(triggerName,triggerGroupName)
.startNow().withSchedule(scheduleBuilder).usingJobData("trigger參數","trigger值")
.build();
SchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = null;
try {
scheduler = stdSchedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail,triggerCron);
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
