在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容器托管的对象相关推荐

  1. Servlet自动注入Spring容器中的Bean解决方法

    Servlet自动注入Spring容器中的Bean解决方法 参考文章: (1)Servlet自动注入Spring容器中的Bean解决方法 (2)https://www.cnblogs.com/jank ...

  2. Struts2与Spring集成中的自动装配策略

    http://www.blogjava.net/jeffma/archive/2010/11/30/339414.html 自动装配即bean之间的依赖关系无需手动配置. 1.    与自动装配有关的 ...

  3. 13.SpringMVC和Spring集成(一) 14.SpringMVC和Spring集成(二)

    1.概念 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,Spring致力于J2EE应用的各层的解决方案,Spring是企业应用开发的"一站式& ...

  4. 在不受Spring管理的类中注入spring 管理的对象

    前几天在做一个任务时,需要在一个普通的java类(不受Spring管理的类)中,调用 spring data jpa的某个xxxReponsitory 接口,同时需要读取properties 文件中的 ...

  5. Spring Boot + IntelliJ IDEA——自动部署[Spring Boot热部署]+LiveReload[前端自动刷新、热加载]解决方案

    基本概念 spring-boot-devtools: Spring Boot包括一组额外的工具,这些工具可以使应用程序开发体验更加愉快.该spring-boot-devtools模块可以包含在任何项目 ...

  6. idea自动识别spring框架配置文件,自动提示spring配置

    最近看到其他人在使用idea的时候编辑springboot框架的application.properties配置文件时能够自动提示并且该文件在idea里面显示是的是一片绿叶的样子,而我本地却无提示显示 ...

  7. 【spring】在servlet中注入spring的bean,servlet容器和spring容器

    一.Servlet容器 Servlet的整个生命周期好象都是由Servlet容器来处理的. 如果把它硬放到Spring容器中去创建,Servlet对象是可被Spring容器建出来,但Servlet容器 ...

  8. Spring官网阅读(三)自动注入

    上篇文章我们已经学习了1.4小结中关于依赖注入跟方法注入的内容.这篇文章我们继续学习这结中的其他内容,顺便解决下我们上篇文章留下来的一个问题-----注入模型. 前言: 在看下面的内容之前,我们先要对 ...

  9. 【Spring】Spring 自动注入(autowire)详解

    1.概述 转载:添加链接描述 2. 手动注入的不足 [Spring]Spring 依赖注入之手动注入 上篇文章中介绍了依赖注入中的手动注入,所谓手动注入是指在xml中采用硬编码的方式来配置注入的对象, ...

  10. Spring学习第5篇:自动注入(autowire)详解

    大家家好,我是一名网络怪咖,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知Spring重要性,现在普遍都使用SpringBoot来开发,面试的时候SpringBoot原理也 ...

最新文章

  1. 小猿圈Linux学习-Linux种搜索的命令
  2. extjs4.0的高级组件grid补充01选择模式selection和表格特性feature
  3. android Binary XML file line #1: Binary XML file line #1: Error inflating class x 问题详解
  4. TensorFlow 自动文本摘要生成模型,2016
  5. sql时间格式转换yyyymm_XML和实体类之间的转换
  6. 配置hiveserver2访问hive
  7. php如何修改二维数组的值,php如何改变二维数组的值
  8. Xcode4.4 import header 的问题解决方法
  9. Python学习-07-面向对象编程初级
  10. python语言的主网址-Python简介
  11. 运用提示原则证明线性无关
  12. RPM中SPEC宏定义对应路径
  13. python一维数组聚类
  14. 手把手教你搭建FastDFS集群(上)
  15. mysql软件可行性分析报告_软件工程作业 图书馆管理系统可行性分析报告
  16. 多智能体一致性(Consensus)中的矩阵理论(Matrix Theory)
  17. Photoshop CC2019安装教程
  18. 白盒测试和黑盒测试的区别
  19. Python 结构体数组初始化代码示例
  20. 开关量采集模块支持PWM占空比输出无线数据采集模块Modbus TCP协议

热门文章

  1. Tomcat JVM参数配置和自启动配置
  2. IBM Rational Appscan使用之扫描结果分析
  3. 强连通分量(Tarjan)模板
  4. CSS盒模型详解(图文教程)
  5. Codeforces Round #342 (Div. 2) D. Finals in arithmetic(想法题/构造题)
  6. IE和火狐兼容文章javascript兼容
  7. 7类数据分析常见的统计陷阱,快来排雷!
  8. 峰情万种_Enhancement of Peak Visual
  9. 学习数学到底有什么用?
  10. hexo 搜索_Hexo+Github博客最简教程-Dockerfile自动搭建