首頁 > Java > java教程 > 主體

Spring+quartz的實作方式實例

PHP中文网
發布: 2017-06-21 09:28:16
原創
1479 人瀏覽過

      朋友的專案中有點問題。他那邊是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      ">   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>
登入後複製

 
#完成這裡的設定檔設定之後,就可以開始下一步,具體的業務邏輯實現了;

第四步驟具體業務邏輯實作。

這裡要注意的是下圖的兩點

 

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

完成上述之後,我們可以啟動專案看看實際效果了。

這裡可以看到,計時任務依照我們之前在設定中的  0/10 * *  * * ?  每10秒執行一次來運行了。

              

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

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

 

以上是Spring+quartz的實作方式實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板