Quartz与Spring集成 Job如何自动注入Spring容器托管的对象
在Spring中使用Quartz有两种方式实现:
第一种是任务类继承QuartzJobBean,
第二种则是在配置文件里定义任务类和要执行的方法,类和方法可以是普通类。很显然,第二种方式远比第一种方式来的灵活。
测试环境 Spring3 M2 quartz-2.1.7
我们要达到这样的效果
public class CancelUnpaidOrderTask implements Job {@Autowiredprivate AppOrderService orderService;@Overridepublic void execute(JobExecutionContext ctx) throws JobExecutionException {... }
但是Job对象的实例化过程是在Quartz中进行的,AppOrderService是在Spring容器当中的,那么如何将他们关联到一起呢。好在Quartz提供了JobFactory接口,让我们可以自定义实现创建Job的逻辑。
public interface JobFactory {Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws SchedulerException; }
那么我们通过实现JobFactory 接口,在实例化Job以后,在通过ApplicationContext 将Job所需要的属性注入即可
在Spring与Quartz集成时 用到的是org.springframework.scheduling.quartz.SchedulerFactoryBean这个类。源码如下,我们只看最关键的地方。
// Get Scheduler instance from SchedulerFactory.try {this.scheduler = createScheduler(schedulerFactory, this.schedulerName);populateSchedulerContext();if (!this.jobFactorySet && !(this.scheduler instanceof RemoteScheduler)) {// Use AdaptableJobFactory as default for a local Scheduler, unless when// explicitly given a null value through the "jobFactory" bean property.this.jobFactory = new AdaptableJobFactory();}if (this.jobFactory != null) {if (this.jobFactory instanceof SchedulerContextAware) {((SchedulerContextAware) this.jobFactory).setSchedulerContext(this.scheduler.getContext());}this.scheduler.setJobFactory(this.jobFactory);}}
其中红色标记的是重点,如果我们不指定jobFactory,那么Spring就使用AdaptableJobFactory。我们在来看一下这个类的实现
package org.springframework.scheduling.quartz;import java.lang.reflect.Method;import org.quartz.Job; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.spi.JobFactory; import org.quartz.spi.TriggerFiredBundle;import org.springframework.util.ReflectionUtils;public class AdaptableJobFactory implements JobFactory {public Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws SchedulerException {return newJob(bundle);}public Job newJob(TriggerFiredBundle bundle) throws SchedulerException {try {Object jobObject = createJobInstance(bundle);return adaptJob(jobObject);}catch (Exception ex) {throw new SchedulerException("Job instantiation failed", ex);}}protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {// Reflectively adapting to differences between Quartz 1.x and Quartz 2.0...Method getJobDetail = bundle.getClass().getMethod("getJobDetail");Object jobDetail = ReflectionUtils.invokeMethod(getJobDetail, bundle);Method getJobClass = jobDetail.getClass().getMethod("getJobClass");Class jobClass = (Class) ReflectionUtils.invokeMethod(getJobClass, jobDetail);return jobClass.newInstance();}protected Job adaptJob(Object jobObject) throws Exception {if (jobObject instanceof Job) {return (Job) jobObject;}else if (jobObject instanceof Runnable) {return new DelegatingJob((Runnable) jobObject);}else {throw new IllegalArgumentException("Unable to execute job class [" + jobObject.getClass().getName() +"]: only [org.quartz.Job] and [java.lang.Runnable] supported.");}}}
其他的我们都不管,我们就看红色的地方,这里是创建了一个Job,那我们就在这里去给Job的属性进行注入就可以了,让我们写一个类继承它,然后复写这个方法进行对Job的注入。
public class MyJobFactory extends AdaptableJobFactory {//这个对象Spring会帮我们自动注入进来,也属于Spring技术范畴.@Autowiredprivate AutowireCapableBeanFactory capableBeanFactory;protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {//调用父类的方法Object jobInstance = super.createJobInstance(bundle);//进行注入,这属于Spring的技术,不清楚的可以查看Spring的API.capableBeanFactory.autowireBean(jobInstance);return jobInstance;} }
接下来把他配置到Spring当中去
<bean id="jobFactory" class="com.gary.operation.jobdemo.demo1.MyJobFactory"></bean>
然后在把org.springframework.scheduling.quartz.SchedulerFactoryBean的jobFactory设置成我们自己的。
<bean name="MyScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- 其他属性省略 --><property name="jobFactory" ref="jobFactory"></property> </bean>
这样就完成了Spring对Job的注入功能,其实很简单,原理就是在我们扩展JobFactory创建job的方法,在创建完Job以后进行属性注入。
http://www.cnblogs.com/daxin/p/3608320.html
https://github.com/helloworldtang/ch6_2_3/tree/master/src/main/java/com/schedule/quartz
http://my.oschina.net/hhaijun/blog/698498
http://blog.csdn.net/fenglibing/article/details/6847158
http://blog.csdn.net/whaosy/article/details/6298686
Quartz与Spring集成 Job如何自动注入Spring容器托管的对象相关推荐
- Servlet自动注入Spring容器中的Bean解决方法
Servlet自动注入Spring容器中的Bean解决方法 参考文章: (1)Servlet自动注入Spring容器中的Bean解决方法 (2)https://www.cnblogs.com/jank ...
- Struts2与Spring集成中的自动装配策略
http://www.blogjava.net/jeffma/archive/2010/11/30/339414.html 自动装配即bean之间的依赖关系无需手动配置. 1. 与自动装配有关的 ...
- 13.SpringMVC和Spring集成(一) 14.SpringMVC和Spring集成(二)
1.概念 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,Spring致力于J2EE应用的各层的解决方案,Spring是企业应用开发的"一站式& ...
- 在不受Spring管理的类中注入spring 管理的对象
前几天在做一个任务时,需要在一个普通的java类(不受Spring管理的类)中,调用 spring data jpa的某个xxxReponsitory 接口,同时需要读取properties 文件中的 ...
- Spring Boot + IntelliJ IDEA——自动部署[Spring Boot热部署]+LiveReload[前端自动刷新、热加载]解决方案
基本概念 spring-boot-devtools: Spring Boot包括一组额外的工具,这些工具可以使应用程序开发体验更加愉快.该spring-boot-devtools模块可以包含在任何项目 ...
- idea自动识别spring框架配置文件,自动提示spring配置
最近看到其他人在使用idea的时候编辑springboot框架的application.properties配置文件时能够自动提示并且该文件在idea里面显示是的是一片绿叶的样子,而我本地却无提示显示 ...
- 【spring】在servlet中注入spring的bean,servlet容器和spring容器
一.Servlet容器 Servlet的整个生命周期好象都是由Servlet容器来处理的. 如果把它硬放到Spring容器中去创建,Servlet对象是可被Spring容器建出来,但Servlet容器 ...
- Spring官网阅读(三)自动注入
上篇文章我们已经学习了1.4小结中关于依赖注入跟方法注入的内容.这篇文章我们继续学习这结中的其他内容,顺便解决下我们上篇文章留下来的一个问题-----注入模型. 前言: 在看下面的内容之前,我们先要对 ...
- 【Spring】Spring 自动注入(autowire)详解
1.概述 转载:添加链接描述 2. 手动注入的不足 [Spring]Spring 依赖注入之手动注入 上篇文章中介绍了依赖注入中的手动注入,所谓手动注入是指在xml中采用硬编码的方式来配置注入的对象, ...
- Spring学习第5篇:自动注入(autowire)详解
大家家好,我是一名网络怪咖,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知Spring重要性,现在普遍都使用SpringBoot来开发,面试的时候SpringBoot原理也 ...
最新文章
- 小猿圈Linux学习-Linux种搜索的命令
- extjs4.0的高级组件grid补充01选择模式selection和表格特性feature
- android Binary XML file line #1: Binary XML file line #1: Error inflating class x 问题详解
- TensorFlow 自动文本摘要生成模型,2016
- sql时间格式转换yyyymm_XML和实体类之间的转换
- 配置hiveserver2访问hive
- php如何修改二维数组的值,php如何改变二维数组的值
- Xcode4.4 import header 的问题解决方法
- Python学习-07-面向对象编程初级
- python语言的主网址-Python简介
- 运用提示原则证明线性无关
- RPM中SPEC宏定义对应路径
- python一维数组聚类
- 手把手教你搭建FastDFS集群(上)
- mysql软件可行性分析报告_软件工程作业 图书馆管理系统可行性分析报告
- 多智能体一致性(Consensus)中的矩阵理论(Matrix Theory)
- Photoshop CC2019安装教程
- 白盒测试和黑盒测试的区别
- Python 结构体数组初始化代码示例
- 开关量采集模块支持PWM占空比输出无线数据采集模块Modbus TCP协议
热门文章
- Tomcat JVM参数配置和自启动配置
- IBM Rational Appscan使用之扫描结果分析
- 强连通分量(Tarjan)模板
- CSS盒模型详解(图文教程)
- Codeforces Round #342 (Div. 2) D. Finals in arithmetic(想法题/构造题)
- IE和火狐兼容文章javascript兼容
- 7类数据分析常见的统计陷阱,快来排雷!
- 峰情万种_Enhancement of Peak Visual
- 学习数学到底有什么用?
- hexo 搜索_Hexo+Github博客最简教程-Dockerfile自动搭建