博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot集成Quartz注入Spring管理的类
阅读量:5999 次
发布时间:2019-06-20

本文共 3220 字,大约阅读时间需要 10 分钟。

摘要: 在Spring Boot中使用Quartz时,在JOB中一般需要引用Spring管理的Bean,通过定义Job Factory实现自动注入

Spring有自己的Schedule定时任务,在Spring boot中使用的时候,不能动态管理JOB,于是就使用Quartz来实现。

在Spring Boot中配置Quartz:

import java.io.IOException;import java.util.Properties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.PropertiesFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.quartz.SchedulerFactoryBean; @Configuration @EnableScheduling public class QuartzSchedule { @Autowired private MyJobFactory myJobFactory; @Bean public SchedulerFactoryBean schedulerFactoryBean() throws IOException { SchedulerFactoryBean factory = new SchedulerFactoryBean(); factory.setOverwriteExistingJobs(true); // 延时启动 factory.setStartupDelay(20); // 加载quartz数据源配置 factory.setQuartzProperties(quartzProperties()); // 自定义Job Factory,用于Spring注入 factory.setJobFactory(myJobFactory); return factory; } /** * 加载quartz数据源配置 * * @return * @throws IOException */ @Bean public Properties quartzProperties() throws IOException { PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean(); propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties")); propertiesFactoryBean.afterPropertiesSet(); return propertiesFactoryBean.getObject(); } }

为了在JOB中使用Spring管理的Bean,需要重新定义一个Job Factory:

@Componentpublic class MyJobFactory extends AdaptableJobFactory { @Autowired private AutowireCapableBeanFactory capableBeanFactory; @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { // 调用父类的方法 Object jobInstance = super.createJobInstance(bundle); // 进行注入 capableBeanFactory.autowireBean(jobInstance); return jobInstance; } }

然后在JOB中就可以使用Spring管理的Bean了

public class MyJob implements Job, Serializable { private static final long serialVersionUID = 1L; private Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private SomeService someService; @Override public void execute(JobExecutionContext context) throws JobExecutionException { someService.doSomething(); } }

下面代码是创建JOB:

JobDetail jobDetail = JobBuilder.newJob(((Job) Class.forName(job.getClazz()).newInstance()).getClass())                    .withIdentity(job.getJobName(), job.getJobGroup()).build();            jobDetail.getJobDataMap().put("extdata", job.getExtData());            // 表达式调度构建器            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression())                    .withMisfireHandlingInstructionDoNothing();            // 构建一个trigger            TriggerBuilder
triggerBuilder = TriggerBuilder.newTrigger().withIdentity(triggerKey) .withSchedule(scheduleBuilder); if (job.getStartTime() != null) { triggerBuilder.startAt(job.getStartTime()); } if (job.getEndTime() != null) { triggerBuilder.endAt(job.getEndTime()); } CronTrigger trigger = triggerBuilder.build(); scheduler.scheduleJob(jobDetail, trigger);// 注入到管理类

 https://my.oschina.net/hhaijun/blog/698498

 

转载地址:http://uwzmx.baihongyu.com/

你可能感兴趣的文章
iOS多图片下载
查看>>
java 调用OpenOffice将word格式文件转换为pdf格式
查看>>
java中的基本数据类型存放位置
查看>>
jenkins中通过git发版操作记录
查看>>
理解javascript中的Function.prototype.bind
查看>>
dpkg 小记
查看>>
Android开发之ListView实现不同品种分类分隔栏的效果(非ExpandableListView实现)
查看>>
es6 新增字符串方法
查看>>
Spring Boot 学习(3)
查看>>
hdu 3547 DIY Cube (Ploya定理)
查看>>
2017 33 款iOS开源库
查看>>
c++11 实现半同步半异步线程池
查看>>
CODEVS 1029 遍历问题
查看>>
java-关于getClass().getClassLoader()
查看>>
源泉书签,今日更新: 添加真正的书签笔记功能,从此能够不用印象笔记啦
查看>>
Solidworks如何自动打开和关闭特征识别FeatureWorks
查看>>
C# 截屏
查看>>
sublime text修改package安装路径
查看>>
基于JQuery EasyUI的WebMVC控件封装(含源码)
查看>>
Lua Doc生成工具
查看>>