通过前面几篇文章可以知道,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(); } }
六、运行项目

从控制台可以看出结果符合预期

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/31343.html