基於Spring的最簡單的定時任務實現與配置(一)


      朋友的項目中有點問題。他那邊是Spring架構的,有一個比較簡單的需要定時的任務執行。在了解了他的需求之后,於是提出了比較簡單的Spring+quartz的實現方式。(本文所述方法 不適用於 分布式 環境)

      注意本文只是討論,在已搭建完畢的Spring工程下,完成最簡單的定時任務。

      第一步,要知道Spring這個架構,很有趣很有意思。可以做到自由插拔功能模塊的效果。工程項目是基於MAVEN包依賴管理的,所以把這次需要的依賴包引用列出來:

 1 <!-- 定時器依賴 開始 -->
 2 <dependency>
 3 <groupId>org.springframework</groupId>
 4 <artifactId>spring-context-support</artifactId>
 5 <version>4.0.2.RELEASE</version>
 6 </dependency>
 7 
 8  
 9 
10 <dependency>
11 <groupId>org.quartz-scheduler</groupId>
12 <artifactId>quartz</artifactId>
13 <version>2.2.1</version>
14 </dependency>
15 <!-- 定時器依賴 結束 -->

當然,這是要跟對應的Spring的版本是要匹配的。我們這里的工程是4.0.2。前一個包spring-context-support,主要的作用是作為Spring與quartz的溝通管理的部件,如果注釋掉就會報這樣的錯誤

 在MAVEN配置完所需要添加的包之后(其他的包,這里暫時不擴展開說了,本文只討論在完整Spring工程項目下的配置),我們就可以開始動手給這個項目添加,定時任務的功能模塊了。

第二步,從web的項目的起源,web.xml 中改動做起。由於原本的項目Spring的配置文件是Spring-mvc.xml,我這里就把定時任務的配置文件改成了spring-time.xml。這樣就可以通過同一個掃描的配置在啟動的時候去讀取了。具體的代碼如下:

1 <context-param>
2         <param-name>contextConfigLocation</param-name>
3         <param-value>classpath:spring-*.xml</param-value>
4     </context-param>

然后給大家看一下我的工程結構:

                                                     

     通過這樣的配置,項目就會知道怎么去調用了。實現了這一步接下來我們就可以繼續往下走了;

 

    第三步,就是要完成spring-timer.xml這個定時任務的核心配置了。在這個文件配置中,我們主要是完成三件事情:

  1.配置啟動的設置,關於懶加載(簡單說一下,比如把某個變量初始化為null,也是一種懶加載,即在服務啟動之后,只有在實際被調用的時候才會實例化,否則是不會在內存中存在的,只是邏輯上的。可以省空間,但是也可能會導致,問題延遲很久才會被發現,此處不再詳細解說),以及觸發器的配置;

  2.quartz-2.x的配置,包含定時任務觸發之后要調用的job的名字,以及corn表達式(即定時表達式,控制程序在何時重復執行的原因,本次在會在后續補充關於cron表達式的內容);

  3.配置job的內容和job對應的具體的類。

好了邏輯流程解說完畢,上代碼:

 1 <?xml version="1.0" encoding="UTF-8"?>  
 2 <beans xmlns="http://www.springframework.org/schema/beans"  
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 4     xmlns:p="http://www.springframework.org/schema/p"  
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans  
 6      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
 7   
 8         <!-- 啟動觸發器的配置開始 -->  
 9     <bean name="startQuertz" lazy-init="false" autowire="no"  
10         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
11         <property name="triggers">  
12             <list>  
13                 <ref bean="myJobTrigger" />  
14             </list>  
15         </property>  
16     </bean>  
17     <!-- 啟動觸發器的配置結束 -->  
18   
19     <!-- 調度的配置開始 -->  
20     <!--  
21         quartz-1.8以前的配置   
22     <bean id="myJobTrigger"  
23         class="org.springframework.scheduling.quartz.CronTriggerBean">  
24         <property name="jobDetail">  
25             <ref bean="myJobDetail" />  
26         </property>  
27         <property name="cronExpression">  
28             <value>0/1 * * * * ?</value>  
29         </property>  
30     </bean>  
31     -->  
32     <!-- quartz-2.x的配置 -->  
33     <bean id="myJobTrigger"  
34         class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
35         <property name="jobDetail">  
36             <ref bean="myJobDetail" />  
37         </property>  
38         <property name="cronExpression">  
39         
40         <value>0/10 * *  * * ?</value>
41           <!--   <value>1 52 * * * ?</value>  --> 
42         </property>  
43     </bean>  
44     <!-- 調度的配置結束 -->  
45   
46     <!-- job的配置開始 -->  
47     <bean id="myJobDetail"  
48         class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
49         <property name="targetObject">  
50             <ref bean="myJob" />  
51         </property>  
52         <property name="targetMethod">  
53             <value>work</value>  
54         </property>  
55     </bean>  
56     <!-- job的配置結束 -->  
57   
58     <!-- 工作的bean -->  
59     <bean id="myJob" class="com.tec.kevin.quartz.jobTest" />  
60   
61 </beans>  

 

完成這里的配置文件配置之后,就可以開始下一步,具體的業務邏輯實現了;

第四步 具體業務邏輯實現。

這里要注意的是下圖中的兩個點

 

 

上圖是具體的業務實現的類,里面的名字和下圖定時任務配置的要相同。

完成上述之后,我們可以啟動項目看看實際效果了。

這里可以看到,定時任務按照我們之前在配置中的  <value>0/10 * *  * * ?</value>  每10秒執行一次 來運行了。

              

 要注意的是,在實現這個方法的過程中,我遇到了重復執行的情況。就是同一個時間,執行了兩次。后來找到的原因是在配置web.xml的時候,重復配置了定時任務,這樣導致執行了多次。要是有遇到這個情況的,可以參考我的解決方法。

    接來下會有兩篇文章,一篇是寫定時任務的更簡單的實現方法,另外一篇講解cron 表達式。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM