Quartz 实现定时任务
以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();
}
}

浙公网安备 33010602011771号