1. 程式人生 > >使用SpringMvc自帶的Quartz完成定時任務

使用SpringMvc自帶的Quartz完成定時任務

在管理系統中經常有固定的時間點或每隔一段時間就需要執行的任務,JAVA自帶的Timer類中的Task可以完成此功能,但由於配置資訊都是寫在程式碼中的,若想更改只能重新封裝war包,所以大部分的專案會使用quartZ進行定時任務(SpringMVC算是當前java中應用比較廣泛的框架了,本身集成了quartz,使用起來很方便).Timer有個最主要的問題,無法實現指定時間執行,只能是迴圈某個時間段,而quartz完全沒有這種問題.

使用quartz首先需要匯入jar包,commons-discovery-0.2.jar,commons-logging.jar,jaxrpc.jar,log4j-1.2.16.jar,quartz-2.2.1.jar,quartz-jobs-2.2.1.jar,saaj.jar,這些是我使用的jar包,spring版本是4.2,quartz版本是2.2(quzrtz版本一定要和spring版本適配,否則會出現大量的classNotFound的bug).

準備工作完成後就開始quartz的配置了,首先是建立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:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">


        <!-- 要呼叫的工作類 -->
        <bean id="quartzDay" class="com.autoDeduct.AutoDeductDayMail"></bean>

        <!-- 定義呼叫物件和呼叫物件的方法 -->
 		<bean id="daymailtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            <!-- 呼叫的類 -->
            <property name="targetObject">
                <ref bean="quartzDay"/>
            </property>
            <!-- 呼叫類中的方法 -->
            <property name="targetMethod">
                <value>sendMail</value>
            </property>
        </bean>
        
         <bean id="doDayMailTime" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
            <property name="jobDetail">
                <ref bean="daymailtask"/>
            </property>
            <!-- cron表示式 -->
            <property name="cronExpression">
                <!-- 每隔10秒執行一次-->
                <value>0 59 16 * * ?</value>
            </property>
        </bean>        
         
        <!-- 總管理類 如果將lazy-init='false'那麼容器啟動就會執行排程程式 -->
        <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list>
                       <ref bean="doDayMailTime"/>
                </list>
            </property>
        </bean>
   
</beans>
具體的執行頻率和指定時間在doDayMailTime中配置,quartz有專用的cron表示式,具體的表示式可以去網上搜索,根據自己的需求填寫cron表示式,我的功能是每天16.59的時候會呼叫daytimetask中配置的quartzDay類中的sendMail的方法,而quartzDay在開始映射了com. autoDeduct.AutoDeductDayMail,那程式在16.59的時候就會去該類下找到sendMail方法去執行.定時任務就完成了效果.

注意:如果配置完成後,專案啟動出現classnotfound,別急,仔細看看究竟是哪個類不見了,出現這種問題的主要問題一般是jar包對應不好,先去看看自己的專案下的jar包中是否有包含這個類,低版本的quartz是直接呼叫bean的,而高版本的quartz是呼叫factoryBean來創造bean的,如果使用了低版本的quartz需要把bean對應的class設定成對應的bean.