一、pom.xml
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
二、applicationContext-quartz.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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<!-- ======================== 基于SimpleTrigger的spring quartz ======================== -->
<!-- job -->
<bean id="promotionJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="cn.dp.bos.quartz.PromotionJob" />
</bean>
<!-- trigger -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="promotionJob" />
<!-- 立即开始第一次执行 -->
<property name="startDelay" value="0" />
<!-- 每个60秒执行一次 -->
<property name="repeatInterval" value="60000" />
</bean>
<!-- scheduler -->
<!-- 用于解决quartz和spring整合Bean无法注入问题的解决方案 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- <property name="jobFactory" ref="jobFactory" /> -->
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
</list>
</property>
</bean>
<!-- ======================== 基于CronTrigger的spring quartz ======================== -->
<!-- job -->
<!--<bean id="promotionJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="cn.dp.bos.quartz.PromotionJob"/>
<property name="jobDataAsMap">
<map>
<entry key="timeout" value="5"/>
</map>
</property>
</bean>-->
<!-- ======================== 调度触发器 ======================== -->
<!--<bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="promotionJob"></property>
<property name="cronExpression" value="0 1 * * * ?"></property>
</bean>-->
<!-- ======================== 调度工厂 ======================== -->
<!--<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory" ref="jobFactory" />
<property name="triggers">
<list>
<ref bean="cronTriggerBean" />
</list>
</property>
</bean>-->
</beans>
三、Job
import java.util.Date;
/**
* 定时设置宣传任务的状态
*/
public class PromotionJob implements Job {
@Autowired
private PromotionService promotionService;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("活动过期处理程序执行...");
// 每分钟执行一次,当前时间比较promotion数据表endDate,活动已经过期,设置status='2'
promotionService.updateStatus(new Date());
}
}
注意:由于PromotionJob无法通过Spring的@Autowired注入PromotionService,在运行时候,会出现NullPointerException异常:
java.lang.NullPointerException
at cn.dp.bos.quartz.PromotionJob.execute(PromotionJob.java:23)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
21:46:16,222 ERROR ErrorLogger:2425 - Job (DEFAULT.promotionJob threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.NullPointerException]
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: java.lang.NullPointerException
at cn.dp.bos.quartz.PromotionJob.execute(PromotionJob.java:23)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
... 1 more
解决方法:通过如下Spring配置,实现注入
<!-- scheduler -->
<!-- 用于解决quartz和spring整合Bean无法注入问题的解决方案 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory" ref="jobFactory" />
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
</list>
</property>
</bean>
四、JobFactory
@Service("jobFactory")
public class JobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
// 调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
// 进行注入
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}