通过前面几篇文章可以知道,quartz的shiy使用其实就是3个步数,即
1)job - 任务-
2)Trigger - 触发器
3)Scheduler - 任务调度
在实际项目中,一个项目里往往存在不同定时需求的任务处理,如果按照上一篇文章中的方法,那肯定是不太好的,我们可以将quartz封装成一个工具类来使用。
一、修改服务层代码
修改上一篇使用到的UserService,新增一个方法用于另一个任务中。
@Service
public class UserService {
public void addUser() {
System.out.println("**>addUser");
}
public void deleteUser() {
System.out.println("**>deleteUser");
}
}
二、创建2个定时任务Job
1) MyJob1.java
public class MyJob1 implements Job {
@Autowired
UserService userService;
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
userService.addUser();
System.out.println("任务1:"+new Date());
}
}
2) MyJob2.java
public class MyJob2 implements Job {
@Autowired
UserService userService;
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
userService.deleteUser();
System.out.println("任务2:"+new Date());
}
}
三、自定义AdaptableJobFactory
沿用上一篇的MyAdaptableJobFactory.java
四、封装QuartzScheduler
这里只编写了启动任务的方法,诸如暂停、恢复、删除任务类似。
@Component
@Configuration
public class QuartzSchedulerConfig {
@Autowired
private Scheduler scheduler;
@Autowired
private MyAdaptableJobFactory myAdaptableJobFactory;
public <E extends Job> void startJob(String name, String group,String cron,Class<E> clz) throws SchedulerException {
// 通过JobBuilder构建JobDetail实例,JobDetail规定只能是实现Job接口的实例
// JobDetail 是具体Job实例
JobDetail jobDetail = JobBuilder.newJob(clz).withIdentity(name, group).build();
// 基于表达式构建触发器
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
// CronTrigger表达式触发器 继承于Trigger
// TriggerBuilder 用于构建触发器实例
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(name, group)
.withSchedule(cronScheduleBuilder).build();
scheduler.scheduleJob(jobDetail, cronTrigger);
scheduler.setJobFactory(myAdaptableJobFactory);
scheduler.start();
}
}
五、创建job监听器
继承ApplicationListener,并且要将scheduler注入;
通过代码可以看出,任务MyJob1每隔2秒执行一次,任务MyJob2每隔4秒执行一次;
@Configuration
public class QuartzStartJobListener implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private QuartzSchedulerConfig quartzScheduler;
@Override
public void onApplicationEvent(ContextRefreshedEvent arg0) {
try {
quartzScheduler.startJob("job1", "group1", "0/2 * * * * ?", MyJob1.class);
quartzScheduler.startJob("job2", "group2", "0/4 * * * * ?", MyJob2.class);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 初始注入scheduler
* @return
* @throws SchedulerException
*/
@Bean
public Scheduler scheduler() throws SchedulerException{
SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
return schedulerFactoryBean.getScheduler();
}
}
六、运行项目
从控制台可以看出结果符合预期