Spring+Quartz踩到的坑

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~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章