quartz job 注入 spring 管理的 bean
阿新 • • 發佈:2019-02-11
轉載自 https://blog.csdn.net/leocnx/article/details/54573275
背景:
在quartz job 裡呼叫spring 容器管理的bean,出現空指標異常,即沒有注入成功,在網上搜了很多類似的問題,最終發現都是copy改,經過各種折騰算是解決了問題。
解決方法有兩種:
第一種方式:不去繼承QuartzJobBean,只是一個獨立的job bean,通過配置MethodInvokingJobDetailFactoryBean來實現;
第二種方式:繼承QuartzJobBean,但是要重寫SchedulerFactoryBean的jobFactory。
首先說明下版本:
- <
- <quartz.version>2.2.2</quartz.version>
程式碼結構如下:
說明:
MyJobAlone為不用繼承方式實現的job bean
MyJobExtend為使用繼承方式實現的job bean
MyQuartzJobFactory為重寫的jobFactory,用於實現在使用繼承方式時注入spring管理的bean
SayServiceImpl為spring 管理的bean
-SayService.java
- package top.auok.quartz.bean;
- publicinterface SayService {
- void sayHello();
- }
-SayServiceImpl.java
- package top.auok.quartz.bean;
- import org.springframework.stereotype.Service;
- @Service("sayService")
- publicclass SayServiceImpl implements SayService {
- @Override
- publicvoid sayHello() {
- System.out.println("hello, i'm invoked by quartz."
- }
- }
-applicationContext.xml
- <?xmlversion="1.0"encoding="UTF-8"?>
- <beansxmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.1.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
- <context:component-scanbase-package="top.auok.quartz"/>
- </beans>
applicationContext-quartz-alone.xml為非繼承方式的配置檔案
applicationContext-quartz-extend.xml為繼承方式的配置檔案
第一種方式:(非繼承)
1.job bean - MyJobAlone.java程式碼如下:
- package top.auok.quartz;
- import javax.annotation.Resource;
- import org.springframework.stereotype.Component;
- import top.auok.quartz.bean.SayService;
- @Component("myJobAlone")
- publicclass MyJobAlone {
- @Resource
- private SayService sayService;
- publicvoid execute() {
- sayService.sayHello();
- }
- }
2.配置 - applicationContext-quartz-alone.xml:
- <?xmlversion="1.0"encoding="UTF-8"?>
- <beansxmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.1.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
- <!-- jobDetail -->
- <beanid="aloneJobDetail"
- class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
- <propertyname="targetObject">
- <refbean="myJobAlone"/>
- </property>
- <propertyname="targetMethod">
- <value>execute</value>
- </property>
- </bean>
- <!-- trigger -->
- <beanid="aloneTrigger"
- class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
- <propertyname="jobDetail"ref="aloneJobDetail"></property>
- <propertyname="cronExpression"value="0/2 * * * * ?"></property>
- </bean>
- <!-- schedule factory -->
- <beanid="SpringJobSchedulerFactoryBean"
- class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
- <propertyname="triggers">
- <list>
- <refbean="aloneTrigger"/>
- </list>
- </property>
- </bean>
- </beans>
第二種方式:(繼承)
1.job bean - MyJobExtend.java程式碼如下:
- package top.auok.quartz;
- import javax.annotation.Resource;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- import org.springframework.scheduling.quartz.QuartzJobBean;
- import top.auok.quartz.bean.SayService;
- publicclass MyJobExtend extends QuartzJobBean {
- @Resource
- private SayService sayService;
- @Override
- protectedvoid executeInternal(JobExecutionContext arg0) throws JobExecutionException {
- sayService.sayHello();
- }
- }
2.jobFactory - 重寫 -MyQuartzJobFactory.java
- package top.auok.quartz;
- import org.quartz.spi.TriggerFiredBundle;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
- import org.springframework.scheduling.quartz.SpringBeanJobFactory;
- import org.springframework.stereotype.Component;
- @Component("myQuartzJobFactory")
- publicclass MyQuartzJobFactory extends SpringBeanJobFactory {
- @Autowired
- private AutowireCapableBeanFactory beanFactory;
- /**
- *
- * 這裡覆蓋了super的createJobInstance方法,對其創建出來的類再進行autowire。
- *
- */
- @Override
- protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
- Object jobInstance = super.createJobInstance(bundle);
- beanFactory.autowireBean(jobInstance);
- return jobInstance;
- }
- }
3.配置 - applicationContext-quartz-extend.xml:
- <?xmlversion="1.0"encoding="UTF-8"?>
- <beansxmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.1.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
- <!-- jobDetail -->
- <beanid="extendJobDetail"
- class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
- <propertyname="jobClass"value="top.auok.quartz.MyJobExtend"/>
- <propertyname="durability"value="true"/><!-- Jobs added with no trigger must be durable -->
- </bean>
- <!-- trigger -->
- <beanid="extendTrigger"
- class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
- <propertyname="jobDetail"ref="extendJobDetail"></property>
- <propertyname="cronExpression"value="0/2 * * * * ?"></property>
- </bean>
- <!-- schedule factory -->
- <beanid="SpringJobSchedulerFactoryBean"
- class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
- <propertyname="triggers">
- <list>
- <refbean="extendTrigger"/>
- </list>
- </property>
- <propertyname="jobFactory"ref="myQuartzJobFactory"></property>
- </bean>
- </beans>
除錯執行:
- package top.auok.quartz;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- publicclass App {
- publicstaticvoid main(String[] args) {
- // init spring ioc container
- new ClassPathXmlApplicationContext("applicationContext.xml", "applicationContext-quartz-extend.xml"); //按需更改配置檔案alone/extend
- }
- }
the end
附:pom.xml
- <projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>top.auok</groupId>
- <artifactId>quartz</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>quartz</name>
- <url>http://maven.apache.org</url>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <spring.version>4.0.2.RELEASE</spring.version>
- <slf4j.version>1.7.7</slf4j.version>
- <log4j.version>1.2.17</log4j.version>
- <quartz.version>2.2.2</quartz.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context-support</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-tx</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.quartz-scheduler</groupId>
- <artifactId>quartz</artifactId>
- <version>${quartz.version}</version>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>${log4j.version}</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- <version>${slf4j.version}</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>${slf4j.version}</version>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>2.0.2</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- <encoding>utf8</encoding>
- </configuration>
- </plugin>
- </plugins>
- </build>
- </project>
程式碼下載