Quartz是一個完全由Java編寫的開源作業調度框架,爲在Java應用程序中進行作業調度提供了簡單卻強大的機制。Quartz允許開發人員根據時間間隔來調度作業。它實現了作業和觸發器的多對多的關係,還能把多個作業與不同的觸發器關聯。
Spring就不做什麼介紹了。在實際的操作中,很經常把這兩者結合到一起使用。現在就說一下我在處理Spring+Quartz時候遇到的一些坑,大家引以爲戒。
首先是版本問題,這兩個東西的融合度並不是百分百,換句話說不是隨便搭配的。這裏大家一定要注意:Spring3.1以下和Quartz1搭配,Spring3.1以上最好和Quartz2搭配。
其次,說一下都需要引入什麼包。缺一不可,我就因爲沒有引入一個包,還沒有錯誤提示,找了一下午:
<spring.version>4.2.5.RELEASE</spring.version>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<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>2.2.2</version>
</dependency>
好了,現在的準備工作都可以了。下面主要就是如何進行配置。網上說了好多要添加quartz.properties,如果你沒有特殊的需求,還是不建議你在resource裏面創建這個文件,因爲在引入的quartz的jar包裏面已經包含了默認的quartz.properties。
接下來就是怎麼寫代碼了。
<!--這裏是在你的spring配置文件裏面添加的配置-->
<bean id="getHostTaskJob" class="com.didi.foundation.oceanbank.task.GetHostTask"/>
<bean id="getHostTaskJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="getHostTask"></property>
<property name="targetMethod" value="executor"></property>
<property name="concurrent" value="false"></property>
</bean>
<!--調度觸發器-->
<bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="getHostTaskJobMethod"></property>
<property name="cronExpression" value="0 15 17 * * ?"></property>
</bean>
<!-- ======================== 調度工廠 ======================== -->
<bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerBean"/>
</list>
</property>
</bean>
//函數代碼:
@Component
public class GetHostTask {
private final static Logger logger = LoggerFactory.getLogger(GetHostTask.class);
public void executor() {
//邏輯
}
}
這裏只寫了quartz的一種情況,使用CronTriggerFactoryBean,還有另一種情況使用SimpleTriggerFactoryBean的,具體的情況,大家百度就好了,網上很多。
最後,還要在web.xml裏面配置你的spring,這個不要忘記
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-config.xml</param-value>
</context-param
可能網上還有一種說法,繼承QuartzJobBean,可以達到相同的效果。不過我個人覺得,使用配置文件並且類和方法都是普通的這種方法最方便,尤其是項目部署到服務器端,便於熱部署。裏面還有一些cronExpression的表達式,這個大家百度一下就可以知道。很easy~