1.启动后,控制台也可以看见每3秒输出一次:
2018-08-18 23:24:39.001 INFO 868 --- [Kong-Executor-1] c.l.l.s.chapter22.config.ScheduleConfig : SchedulingConfigurer定时任务:Sat Aug 18 23:24:39 CST 2018 2018-08-18 23:24:42.001 INFO 868 --- [Kong-Executor-1] c.l.l.s.chapter22.config.ScheduleConfig : SchedulingConfigurer定时任务:Sat Aug 18 23:24:42 CST 2018 2018-08-18 23:24:45.000 INFO 868 --- [Kong-Executor-2] c.l.l.s.chapter22.config.ScheduleConfig : SchedulingConfigurer定时任务:Sat Aug 18 23:24:45 CST 2018 基于Quartz实现定时调度由于本章节是基于SpringBoot 1.x版本的,所以没有基于Quartz的starter配置,这里直接引入了Quartz相关依赖包来集成。
题外话:原本使用SpringMvc时,一般上都是通过xml文件,配置其org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean类进行具体执行任务的配置,指定执行的对象和方法。然后通过设置CronTriggerFactoryBean或者SimpleTriggerFactoryBean设置定时器,最后通过org.springframework.scheduling.quartz.SchedulerFactoryBean加入调度的trigger。所以,我们就使用javaConfig方式进行简单集成下。
0.加入pom依赖
<!-- quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency> <!-- spring集成quartz --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <!-- 因为SchedulerFactoryBean中依赖了org.springframework.transaction.PlatformTransactionManager,所以需依赖tx相关包,其实还是quartz有个分布式功能,是使用数据库完成的。 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </dependency>1.编写配置类。
@Configuration @Slf4j public class QuartzConfig { /** * 通过工厂类,创建job实例 * @return */ @Bean public MethodInvokingJobDetailFactoryBean customJobDetailFactoryBean() { MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean(); //设置执行任务的bean jobDetail.setTargetBeanName("quartzTask"); //设置具体执行的方法 jobDetail.setTargetMethod("quartzTask"); //同步执行,上一任务未执行完,下一任务等待 //true 任务并发执行 //false 下一个任务必须等待上一任务完成 jobDetail.setConcurrent(false); return jobDetail; } /** * 通过工厂类创建Trigger * @param jobDetailFactoryBean * @return * @throws ParseException */ @Bean(name = "cronTriggerBean") public Trigger cronTriggerBean(MethodInvokingJobDetailFactoryBean jobDetailFactoryBean) throws ParseException { CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean(); cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject()); cronTriggerFactoryBean.setCronExpression("0/3 * * * * ?");//每3秒执行一次 cronTriggerFactoryBean.setName("customCronTrigger"); cronTriggerFactoryBean.afterPropertiesSet(); return cronTriggerFactoryBean.getObject(); } /** * 调度工厂类,自动注入Trigger * @return */ @Bean public SchedulerFactoryBean schedulerFactoryBean(Trigger... triggers) { SchedulerFactoryBean bean = new SchedulerFactoryBean(); //也可以直接注入 ApplicationContext,利于 getBeansOfType获取trigger // Map<String,Trigger> triggerMap = appContext.getBeansOfType(Trigger.class); // if(triggerMap != null) { // List<Trigger> triggers = new ArrayList<>(triggerMap.size()); // // // triggerMap.forEach((key,trigger)->{ // triggers.add(trigger); // }); // bean.setTriggers(triggers.toArray(new Trigger[triggers.size()])); // } //这里注意 对应的trigger 不能为null 不然会异常的 bean.setTriggers(triggers); return bean; } @Component("quartzTask") public class QuartzTask { public void quartzTask() { log.info("Quartz定时任务:" + new Date()); } } }2.启动后,可以看见控制台以每3秒执行一次输出:
2018-08-18 23:42:03.019 INFO 772 --- [ryBean_Worker-2] c.l.l.s.chapter22.config.QuartzConfig : Quartz定时任务:Sun Aug 18 23:42:03 CST 2018 2018-08-18 23:42:06.002 INFO 772 --- [ryBean_Worker-3] c.l.l.s.chapter22.config.QuartzConfig : Quartz定时任务:Sun Aug 18 23:42:06 CST 2018 2018-08-18 23:42:09.002 INFO 772 --- [ryBean_Worker-4] c.l.l.s.chapter22.config.QuartzConfig : Quartz定时任务:Sun Aug 18 23:42:09 CST 2018关于Quartz的详细用法,再次不表了。好久没有使用过了。有机会再来详细阐述吧。
分布式调度服务浅谈