1. 程式人生 > >quartz job 注入 spring 管理的 bean

quartz job 注入 spring 管理的 bean

轉載自 https://blog.csdn.net/leocnx/article/details/54573275

背景:

在quartz job 裡呼叫spring 容器管理的bean,出現空指標異常,即沒有注入成功,在網上搜了很多類似的問題,最終發現都是copy改,經過各種折騰算是解決了問題。

解決方法有兩種:

第一種方式:不去繼承QuartzJobBean,只是一個獨立的job bean,通過配置MethodInvokingJobDetailFactoryBean來實現;

第二種方式:繼承QuartzJobBean,但是要重寫SchedulerFactoryBean的jobFactory。

首先說明下版本:

  1. <
    spring.version>4.0.2.RELEASE</spring.version>
  2. <quartz.version>2.2.2</quartz.version>

程式碼結構如下:


說明:

MyJobAlone為不用繼承方式實現的job bean

MyJobExtend為使用繼承方式實現的job bean

MyQuartzJobFactory為重寫的jobFactory,用於實現在使用繼承方式時注入spring管理的bean

SayServiceImpl為spring 管理的bean

-SayService.java

  1. package top.auok.quartz.bean;  
  2. publicinterface SayService {  
  3.     void sayHello();  
  4. }  

-SayServiceImpl.java
  1. package top.auok.quartz.bean;  
  2. import org.springframework.stereotype.Service;  
  3. @Service("sayService")  
  4. publicclass SayServiceImpl implements SayService {  
  5.     @Override
  6.     publicvoid sayHello() {  
  7.         System.out.println("hello, i'm invoked by quartz."
    );  
  8.     }  
  9. }  

-applicationContext.xml
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"
  4.     xmlns:context="http://www.springframework.org/schema/context"
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"
  6.     xmlns:tx="http://www.springframework.org/schema/tx"
  7.     xmlns:aop="http://www.springframework.org/schema/aop"
  8.     xsi:schemaLocation="http://www.springframework.org/schema/beans      
  9.                         http://www.springframework.org/schema/beans/spring-beans-3.1.xsd      
  10.                         http://www.springframework.org/schema/context      
  11.                         http://www.springframework.org/schema/context/spring-context-3.1.xsd      
  12.                         http://www.springframework.org/schema/mvc      
  13.                         http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd  
  14.                         http://www.springframework.org/schema/tx     
  15.                         http://www.springframework.org/schema/tx/spring-tx.xsd  
  16.                         http://www.springframework.org/schema/aop      
  17.                         http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
  18.     <context:component-scanbase-package="top.auok.quartz"/>
  19. </beans>


applicationContext-quartz-alone.xml為非繼承方式的配置檔案

applicationContext-quartz-extend.xml為繼承方式的配置檔案

第一種方式:(非繼承)

1.job bean - MyJobAlone.java程式碼如下:

  1. package top.auok.quartz;  
  2. import javax.annotation.Resource;  
  3. import org.springframework.stereotype.Component;  
  4. import top.auok.quartz.bean.SayService;  
  5. @Component("myJobAlone")  
  6. publicclass MyJobAlone {  
  7.     @Resource
  8.     private SayService sayService;  
  9.     publicvoid execute() {  
  10.         sayService.sayHello();  
  11.     }  
  12. }  

2.配置 - applicationContext-quartz-alone.xml:
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"
  4.     xmlns:context="http://www.springframework.org/schema/context"
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"
  6.     xmlns:tx="http://www.springframework.org/schema/tx"
  7.     xmlns:aop="http://www.springframework.org/schema/aop"
  8.     xsi:schemaLocation="http://www.springframework.org/schema/beans      
  9.                         http://www.springframework.org/schema/beans/spring-beans-3.1.xsd      
  10.                         http://www.springframework.org/schema/context      
  11.                         http://www.springframework.org/schema/context/spring-context-3.1.xsd      
  12.                         http://www.springframework.org/schema/mvc      
  13.                         http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd  
  14.                         http://www.springframework.org/schema/tx     
  15.                         http://www.springframework.org/schema/tx/spring-tx.xsd  
  16.                         http://www.springframework.org/schema/aop      
  17.                         http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
  18.     <!-- jobDetail -->
  19.     <beanid="aloneJobDetail"
  20.         class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  21.         <propertyname="targetObject">
  22.             <refbean="myJobAlone"/>
  23.         </property>
  24.         <propertyname="targetMethod">
  25.             <value>execute</value>
  26.         </property>
  27.     </bean>
  28.     <!-- trigger -->
  29.     <beanid="aloneTrigger"
  30.         class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
  31.         <propertyname="jobDetail"ref="aloneJobDetail"></property>
  32.         <propertyname="cronExpression"value="0/2 * * * * ?"></property>
  33.     </bean>
  34.     <!-- schedule factory -->
  35.     <beanid="SpringJobSchedulerFactoryBean"
  36.         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  37.         <propertyname="triggers">
  38.             <list>
  39.                 <refbean="aloneTrigger"/>
  40.             </list>
  41.         </property>
  42.     </bean>
  43. </beans>

第二種方式:(繼承)

1.job bean - MyJobExtend.java程式碼如下:

  1. package top.auok.quartz;  
  2. import javax.annotation.Resource;  
  3. import org.quartz.JobExecutionContext;  
  4. import org.quartz.JobExecutionException;  
  5. import org.springframework.scheduling.quartz.QuartzJobBean;  
  6. import top.auok.quartz.bean.SayService;  
  7. publicclass MyJobExtend extends QuartzJobBean {  
  8.     @Resource
  9.     private SayService sayService;  
  10.     @Override
  11.     protectedvoid executeInternal(JobExecutionContext arg0) throws JobExecutionException {  
  12.         sayService.sayHello();  
  13.     }  
  14. }  

2.jobFactory - 重寫 -MyQuartzJobFactory.java
  1. package top.auok.quartz;  
  2. import org.quartz.spi.TriggerFiredBundle;  
  3. import org.springframework.beans.factory.annotation.Autowired;  
  4. import org.springframework.beans.factory.config.AutowireCapableBeanFactory;  
  5. import org.springframework.scheduling.quartz.SpringBeanJobFactory;  
  6. import org.springframework.stereotype.Component;  
  7. @Component("myQuartzJobFactory")  
  8. publicclass MyQuartzJobFactory extends SpringBeanJobFactory {  
  9.     @Autowired
  10.     private AutowireCapableBeanFactory beanFactory;  
  11.     /** 
  12.      *  
  13.      * 這裡覆蓋了super的createJobInstance方法,對其創建出來的類再進行autowire。 
  14.      *  
  15.      */
  16.     @Override
  17.     protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {  
  18.         Object jobInstance = super.createJobInstance(bundle);  
  19.         beanFactory.autowireBean(jobInstance);  
  20.         return jobInstance;  
  21.     }  
  22. }  

3.配置 - applicationContext-quartz-extend.xml:
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"
  4.     xmlns:context="http://www.springframework.org/schema/context"
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"
  6.     xmlns:tx="http://www.springframework.org/schema/tx"
  7.     xmlns:aop="http://www.springframework.org/schema/aop"
  8.     xsi:schemaLocation="http://www.springframework.org/schema/beans      
  9.                         http://www.springframework.org/schema/beans/spring-beans-3.1.xsd      
  10.                         http://www.springframework.org/schema/context      
  11.                         http://www.springframework.org/schema/context/spring-context-3.1.xsd      
  12.                         http://www.springframework.org/schema/mvc      
  13.                         http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd  
  14.                         http://www.springframework.org/schema/tx     
  15.                         http://www.springframework.org/schema/tx/spring-tx.xsd  
  16.                         http://www.springframework.org/schema/aop      
  17.                         http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
  18.     <!-- jobDetail -->
  19.     <beanid="extendJobDetail"
  20.         class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
  21.         <propertyname="jobClass"value="top.auok.quartz.MyJobExtend"/>
  22.         <propertyname="durability"value="true"/><!-- Jobs added with no trigger must be durable -->
  23.     </bean>
  24.     <!-- trigger -->
  25.     <beanid="extendTrigger"
  26.         class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
  27.         <propertyname="jobDetail"ref="extendJobDetail"></property>
  28.         <propertyname="cronExpression"value="0/2 * * * * ?"></property>
  29.     </bean>
  30.     <!-- schedule factory -->
  31.     <beanid="SpringJobSchedulerFactoryBean"
  32.         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  33.         <propertyname="triggers">
  34.             <list>
  35.                 <refbean="extendTrigger"/>
  36.             </list>
  37.         </property>
  38.         <propertyname="jobFactory"ref="myQuartzJobFactory"></property>
  39.     </bean>
  40. </beans>


除錯執行:

  1. package top.auok.quartz;  
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  3. publicclass App {  
  4.     publicstaticvoid main(String[] args) {  
  5.         // init spring ioc container
  6.         new ClassPathXmlApplicationContext("applicationContext.xml""applicationContext-quartz-extend.xml");  //按需更改配置檔案alone/extend
  7.     }  
  8. }  

the end

附:pom.xml

  1. <projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3.     <modelVersion>4.0.0</modelVersion>
  4.     <groupId>top.auok</groupId>
  5.     <artifactId>quartz</artifactId>
  6.     <version>0.0.1-SNAPSHOT</version>
  7.     <packaging>jar</packaging>
  8.     <name>quartz</name>
  9.     <url>http://maven.apache.org</url>
  10.     <properties>
  11.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12.         <spring.version>4.0.2.RELEASE</spring.version>
  13.         <slf4j.version>1.7.7</slf4j.version>
  14.         <log4j.version>1.2.17</log4j.version>
  15.         <quartz.version>2.2.2</quartz.version>
  16.     </properties>
  17.     <dependencies>
  18.         <dependency>
  19.             <groupId>org.springframework</groupId>
  20.             <artifactId>spring-context-support</artifactId>
  21.             <version>${spring.version}</version>
  22.         </dependency>
  23.         <dependency>
  24.             <groupId>org.springframework</groupId>
  25.             <artifactId>spring-tx</artifactId>
  26.             <version>${spring.version}</version>
  27.         </dependency>
  28.         <dependency>
  29.             <groupId>org.quartz-scheduler</groupId>
  30.             <artifactId>quartz</artifactId>
  31.             <version>${quartz.version}</version>
  32.         </dependency>
  33.         <dependency>
  34.             <groupId>log4j</groupId>
  35.             <artifactId>log4j</artifactId>
  36.             <version>${log4j.version}</version>
  37.         </dependency>
  38.         <dependency>
  39.             <groupId>org.slf4j</groupId>
  40.             <artifactId>slf4j-api</artifactId>
  41.             <version>${slf4j.version}</version>
  42.         </dependency>
  43.         <dependency>
  44.             <groupId>org.slf4j</groupId>
  45.             <artifactId>slf4j-log4j12</artifactId>
  46.             <version>${slf4j.version}</version>
  47.         </dependency>
  48.     </dependencies>
  49.     <build>
  50.         <plugins>
  51.             <plugin>
  52.                 <artifactId>maven-compiler-plugin</artifactId>
  53.                 <version>2.0.2</version>
  54.                 <configuration>
  55.                     <source>1.8</source>
  56.                     <target>1.8</target>
  57.                     <encoding>utf8</encoding>
  58.                 </configuration>
  59.             </plugin>
  60.         </plugins>
  61.     </build>
  62. </project>


程式碼下載