Spring quartz定时任务service注入问题
今天想单元测试一下spring中的quartz定时任务,job类的大致结构和下面的SpringQtz1类相似,我的是实现的org.quartz.Job接口,到最后总是发现job类里注入的service为null。一开始还以为spring的配置问题,各种找原因,最后还是确定是没有注入的原因。
就去网上搜搜吧。也找出来一些眉目。简单的理解这个原因是job是在quartz中实例化出来的,不受spring的管理。所以就导致注入不进去了。参考这个文章
http://www.tuicool.com/articles/Qjyamu
找着试试的态度,就按照文章里说的。new一个类
public class MyJobFactory extends AdaptableJobFactory { //这个对象Spring会帮我们自动注入进来,也属于Spring技术范畴.
@Autowired
private 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>
这样就ok了。
问题算是解决了吧,但是想着还要自己写一个类,还要配置到其它地方,感觉破坏了quartz的完整性,事情不应该是这样子的。就试着找找其它方法。
正好前几天写spring和quartz的例子的时候,一个文章介绍了spring下quartz定时任务的两种方式。博文地址http://kevin19900306.iteye.com/blog/1397744
一个是继承QuartzJobBean,另一个不用继承,单纯的java类。我想QuartzJobBean是spring里的类,这样的话这个方式的定时任务类是否就是spring来管理的。注入应该就没问题了吧。
这是一个很小的项目,实验起来也很简单,就启动,debug。发现还是注入不进去。就接着试第二种方式,debug。惊奇的发现注入没问题了。
到此为止,这个问题已经解决了。当然还是最后一种方式合理简单。
--------------------------------------------------------------------------------------------------------------------------------
Junit的加入
如果再加上Junit的话,情况可能会再复杂一点。有一个现象就是你如果运行了测试方法,就是你可能看不到定时任务运行。在进行任务类里打断点,也可能不起作用,原因就是junit是另一个单独的线程,
这个线程结束了,就整个结束了,所以可能就轮不到定时任务运行。junit的这一特点,如果你想测试多线程的代码,也可能会得到不是你想要的结果。关于怎么测试多线程,请自行百度。
这里有两个解决方案,第一,像贴出的代码里一样,加入这样的代码,这个代码的作用就是防止junit方法的线程退出。
System.out.println("请输入信息:");
Scanner input = new Scanner(System.in);
int x= input.nextInt();
System.out.println(x);
第二个方法就是,不加上面的代码,加入下面的代码也可能达到定时任务能正常运行的效果。
@Before
public void before(){
System.out.println("============启动前============");
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
}
还有junit测试类里增加了一个自己手动写scheduler调用job的方法,我试了一下,这种方式的service没法注入。虽然这种方式测试job比较灵活一些。
新增加的Junit测试类
import com.dupang.quartz.SpringQtz1;
import org.junit.Before;
import org.junit.Test;
import org.quartz.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; import java.io.InputStream;
import java.util.Calendar;
import java.util.Scanner; /**
* Created by dupang on 2016/11/15.
*/
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
public class JunitTest extends AbstractJUnit4SpringContextTests { @Before
public void before(){
//System.out.println("============启动前============");
//ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
}
@Test
public void helloTest(){
System.out.println("dupang");
System.out.println("请输入信息:");
Scanner input = new Scanner(System.in);
int x= input.nextInt();
System.out.println(x);
} @Test
public void schedulerTest() throws SchedulerException {
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
sched.start(); JobDetail jobDetail = new JobDetail("myJob",Scheduler.DEFAULT_GROUP,SpringQtz1.class); SimpleTrigger trigger = new SimpleTrigger("testTrigger", Scheduler.DEFAULT_GROUP);
trigger.setRepeatCount(10);
trigger.setRepeatInterval(500);
trigger.setStartTime(Calendar.getInstance().getTime()); sched.scheduleJob(jobDetail, trigger);
System.out.println("请输入信息:");
Scanner input = new Scanner(System.in);
int x= input.nextInt();
System.out.println(x);
}
}
貌似不能上传附件就把所有源码贴过来吧。
目录结构为
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion>
<packaging>war</packaging> <name>test</name>
<groupId>test</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<springframework.version>3.0.5.RELEASE</springframework.version>
</properties>
<dependencies> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework.version}</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springframework.version}</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${springframework.version}</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${springframework.version}</version>
</dependency> <dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.5</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${springframework.version}</version>
</dependency>
</dependencies> </project>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.dupang.*" /> <bean id="jobFactory" class="com.dupang.util.MyJobFactory"></bean> <!-- 配置调度程序quartz ,其中配置JobDetail有两种方式-->
<!--方式一:使用JobDetailBean,任务类必须实现Job接口 -->
<bean id="myjob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="name" value="exampleJob"></property>
<property name="jobClass" value="com.dupang.quartz.SpringQtz1"></property>
<property name="jobDataAsMap">
<map>
<entry key="service"><value>simple is the beat</value></entry>
</map>
</property>
</bean>
<!--运行时请将方式一注释掉! -->
<!-- 方式二:使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法-->
<!-- 定义目标bean和bean中的方法 -->
<bean id="SpringQtzJob" class="com.dupang.quartz.SpringQtz2"/>
<bean id="SpringQtzJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="SpringQtzJob"/>
</property>
<property name="targetMethod"> <!-- 要执行的方法名称 -->
<value>execute</value>
</property>
</bean> <!-- ======================== 调度触发器 ======================== -->
<bean id="CronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="SpringQtzJobMethod"></property>
<property name="cronExpression" value="0/5 * * * * ?"></property>
</bean> <!-- ======================== 调度工厂 ======================== -->
<bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="CronTriggerBean"/>
</list>
</property>
</bean> </beans>
MyJobFactory
package com.dupang.util; import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory; /**
* Created by dupang on 2016/11/14.
*/
public class MyJobFactory extends AdaptableJobFactory { //这个对象Spring会帮我们自动注入进来,也属于Spring技术范畴.
@Autowired
private AutowireCapableBeanFactory capableBeanFactory; protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
//调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
//进行注入,这属于Spring的技术,不清楚的可以查看Spring的API.
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
HelloService
package com.dupang.service; /**
* Created by dupang on 2016/11/14.
*/
public interface HelloService { void sayHello(String name);
}
HelloServiceImpl
package com.dupang.impl; import com.dupang.service.HelloService;
import com.sun.javafx.collections.SourceAdapterChange;
import org.springframework.stereotype.Service; /**
* Created by dupang on 2016/11/14.
*/
@Service
public class HelloServiceImpl implements HelloService {
public void sayHello(String name) {
System.out.println("Hello to"+ name);
}
}
SpringQtz1
package com.dupang.quartz; import com.dupang.service.HelloService;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean; import javax.annotation.Resource;
import java.util.Date; /**
* Created by Administrator on 2016/11/9.
*/
public class SpringQtz1 extends QuartzJobBean { @Resource
HelloService helloService;
private static int counter = 0;
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
helloService.sayHello("dupang");
}
}
SpringQtz2
package com.dupang.quartz; import com.dupang.service.HelloService; import javax.annotation.Resource;
import java.util.Date; /**
* Created by Administrator on 2016/11/9.
*/
public class SpringQtz2 {
private static int counter = 0;
@Resource
HelloService helloService;
protected void execute() {
helloService.sayHello("dupang");
}
}
最后,我以前也用过quartz的定时任务,当时里面也有service,我都不记得遇到有注入的问题,后来翻了一下代码,原来就没有用到注入,它是直接getBean()的方式来获取service的。如下图
aaarticlea/png;base64,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" alt="" />
需要源码的留言
插播个广告
老丈人家的粉皮儿,农产品,没有乱七八糟的添加剂,欢迎惠顾
Spring quartz定时任务service注入问题的更多相关文章
- 解决Spring+Quartz无法自动注入bean问题
问题 我们有时需要执行一些定时任务(如数据批处理),比较常用的技术框架有Spring + Quartz中.无奈此方式有个问题:Spring Bean无法自动注入. 环境:Spring3.2.2 + Q ...
- Java Spring Quartz 定时任务
公司需要使用JAVA的WebServer完成简单的定时跑任务的工作.其他例如:每隔30分钟执行锁定用户解锁任务. Quartz 在开源任务调度框架中的翘首,它提供了强大任务调度机制,难能可贵的是它同时 ...
- [Spring] - Quartz定时任务 - Annotation
Spring + Quartz可以使用annoation方式: 1.AppJob类: package com.my.quartz.testquartz1; import org.springframe ...
- Spring+Quartz(定时任务)
此处用到的Quartz版本是quartz-2.2.3 官方网站:http://www.opensymphony.com/quartz 首先先介绍用到的几个关键类:scheduler任务调度.Job任务 ...
- [Spring] Java spring quartz 定时任务
首先,需要导入quartz 的jar包 ① applicationContext.xml <!-- 轮询任务 --> <import resource="classpath ...
- Spring Quartz定时任务设置
这里主要记录一下定时任务的配置,偏向于记录型的一个教程,这里不阐述Quartz的原理. 首先,在Spring配置文件里配置一个自己写好的一个包含执行任务方法的一个类. <bean id=&quo ...
- spring quartz定时任务
配置quartz 在spring中需要三个jar包: quartz-1.8.5.jar.commons-collections-3.2.1.jar.commons-logging-1.1.jar 首先 ...
- 一看便知spring+quartz定时任务
这是我经过网上收集然后加上自己的测试写的,以便大家使用 标配:已测 注意需要的包:(在已经配置spring 的情况下) quartz-all-1.6.jar spring-context ...
- spring + Quartz定时任务配置
<bean id="exportBatchFileTask" class="com.ydcn.pts.task.ExportBatchFileTask"& ...
随机推荐
- 子元素设置margin-top后,父元素跟随下移的问题
子元素设置margin-top后,父元素跟随下移的问题 <!DOCTYPE html> <html lang="en"> <head> < ...
- Scrum立会报告+燃尽图(十一月二十七日总第三十五次):β阶段最后完善
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2415 项目地址:https://git.coding.net/zhang ...
- Thunder团队第七周 - Scrum会议2
Scrum会议2 小组名称:Thunder 项目名称:i阅app Scrum Master:王航 工作照片: 参会成员: 王航(Master):http://www.cnblogs.com/wangh ...
- tensorflow之曲线拟合
视频链接:https://morvanzhou.github.io/tutorials/machine-learning/ML-intro/ 1.定义层 定义 add_layer() from __f ...
- DPDK报文分类与访问控制
原创翻译,转载请注明出处. dpdk提供了一个访问控制库,提供了基于一系列分类规则对接收到的报文进行分类的能力.ACL库用来在一系列规则上执行N元组查找,可以实现多个分类和对每个分类查找最佳匹配(最高 ...
- Linux输入子系统:多点触控协议 -- multi-touch-protocol.txt768
转自:http://blog.csdn.net/droidphone/article/details/8434768 Multi-touch (MT) Protocol --------------- ...
- Halcon 学习笔记3 仿射变换
像素的减少 开运算(较少) 腐蚀(去除更多) 对灰度图像的开运算或腐蚀 相当于将灰度图像变暗 像素增加 闭运算(较少) 膨胀(较多) 对灰度图像的闭运算或膨胀 相当于将灰度图像变亮 仿射变换 另外一种 ...
- phpMyadmin导入导出数据中出现的错误处理
1 2
- SQL 抛出异常的例子 RAISERROR 的使用
先创建一个procedure 当输入的值不在0-100之间时会报出异常 create proc proc_x @a int as begin ) ,) else select @a end go 测试 ...
- 第154天:canvas基础(一)
一.canvas简介 <canvas> 是 HTML5 新增的,一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素.它可以用来制作照片集或者制作简单(也不是 ...