Spring定時(shí)任務(wù)實(shí)現(xiàn)與配置(一)
朋友的項(xiàng)目中有點(diǎn)問題。他那邊是Spring架構(gòu)的,有一個(gè)比較簡(jiǎn)單的需要定時(shí)的任務(wù)執(zhí)行。在了解了他的需求之后,于是提出了比較簡(jiǎn)單的Spring+quartz的實(shí)現(xiàn)方式。
注意本文只是討論,在已搭建完畢的Spring工程下,完成最簡(jiǎn)單的定時(shí)任務(wù)。
第一步,要知道Spring這個(gè)架構(gòu),很有趣很有意思??梢宰龅阶杂刹灏喂δ苣K的效果。工程項(xiàng)目是基于MAVEN包依賴管理的,所以把這次需要的依賴包引用列出來:
<!-- 定時(shí)器依賴 開始 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <!-- 定時(shí)器依賴 結(jié)束 -->
當(dāng)然,這是要跟對(duì)應(yīng)的Spring的版本是要匹配的。我們這里的工程是4.0.2。前一個(gè)包spring-context-support,主要的作用是作為Spring與quartz的溝通管理的部件,如果注釋掉就會(huì)報(bào)這樣的錯(cuò)誤

在MAVEN配置完所需要添加的包之后(其他的包,這里暫時(shí)不擴(kuò)展開說了,本文只討論在完整Spring工程項(xiàng)目下的配置),我們就可以開始動(dòng)手給這個(gè)項(xiàng)目添加,定時(shí)任務(wù)的功能模塊了。
第二步,從web的項(xiàng)目的起源,web.xml 中改動(dòng)做起。由于原本的項(xiàng)目Spring的配置文件是Spring-mvc.xml,我這里就把定時(shí)任務(wù)的配置文件改成了spring-time.xml。這樣就可以通過同一個(gè)掃描的配置在啟動(dòng)的時(shí)候去讀取了。具體的代碼如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</context-param>
然后給大家看一下我的工程結(jié)構(gòu):

通過這樣的配置,項(xiàng)目就會(huì)知道怎么去調(diào)用了。實(shí)現(xiàn)了這一步接下來我們就可以繼續(xù)往下走了;
第三步,就是要完成spring-timer.xml這個(gè)定時(shí)任務(wù)的核心配置了。在這個(gè)文件配置中,我們主要是完成三件事情:
1.配置啟動(dòng)的設(shè)置,關(guān)于懶加載(簡(jiǎn)單說一下,比如把某個(gè)變量初始化為null,也是一種懶加載,即在服務(wù)啟動(dòng)之后,只有在實(shí)際被調(diào)用的時(shí)候才會(huì)實(shí)例化,否則是不會(huì)在內(nèi)存中存在的,只是邏輯上的。可以省空間,但是也可能會(huì)導(dǎo)致,問題延遲很久才會(huì)被發(fā)現(xiàn),此處不再詳細(xì)解說),以及觸發(fā)器的配置;
2.quartz-2.x的配置,包含定時(shí)任務(wù)觸發(fā)之后要調(diào)用的job的名字,以及corn表達(dá)式(即定時(shí)表達(dá)式,控制程序在何時(shí)重復(fù)執(zhí)行的原因,本次在會(huì)在后續(xù)補(bǔ)充關(guān)于cron表達(dá)式的內(nèi)容);
3.配置job的內(nèi)容和job對(duì)應(yīng)的具體的類。
好了邏輯流程解說完畢,上代碼:
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 啟動(dòng)觸發(fā)器的配置開始 -->
<bean name="startQuertz" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="myJobTrigger" />
</list>
</property>
</bean>
<!-- 啟動(dòng)觸發(fā)器的配置結(jié)束 -->
<!-- 調(diào)度的配置開始 -->
<!--
quartz-1.8以前的配置
<bean id="myJobTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="myJobDetail" />
</property>
<property name="cronExpression">
<value>0/1 * * * * ?</value>
</property>
</bean>
-->
<!-- quartz-2.x的配置 -->
<bean id="myJobTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="myJobDetail" />
</property>
<property name="cronExpression">
<value>0/10 * * * * ?</value>
<!-- <value>1 52 * * * ?</value> -->
</property>
</bean>
<!-- 調(diào)度的配置結(jié)束 -->
<!-- job的配置開始 -->
<bean id="myJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="myJob" />
</property>
<property name="targetMethod">
<value>work</value>
</property>
</bean>
<!-- job的配置結(jié)束 -->
<!-- 工作的bean -->
<bean id="myJob" class="com.tec.kevin.quartz.jobTest" />
</beans>
完成這里的配置文件配置之后,就可以開始下一步,具體的業(yè)務(wù)邏輯實(shí)現(xiàn)了;
第四步,具體業(yè)務(wù)邏輯實(shí)現(xiàn)。
這里要注意的是下圖中的兩個(gè)點(diǎn)

上圖是具體的業(yè)務(wù)實(shí)現(xiàn)的類,里面的名字和下圖定時(shí)任務(wù)配置的要相同。
完成上述之后,我們可以啟動(dòng)項(xiàng)目看看實(shí)際效果了。

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

要注意的是,在實(shí)現(xiàn)這個(gè)方法的過程中,我遇到了重復(fù)執(zhí)行的情況。就是同一個(gè)時(shí)間,執(zhí)行了兩次。后來找到的原因是在配置web.xml的時(shí)候,重復(fù)配置了定時(shí)任務(wù),這樣導(dǎo)致執(zhí)行了多次。要是有遇到這個(gè)情況的,可以參考我的解決方法。
接來下會(huì)有兩篇文章,一篇是寫定時(shí)任務(wù)的更簡(jiǎn)單的實(shí)現(xiàn)方法,另外一篇講解cron 表達(dá)式。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java中 spring 定時(shí)任務(wù) 實(shí)現(xiàn)代碼
- SpringBoot定時(shí)任務(wù)兩種(Spring Schedule 與 Quartz 整合 )實(shí)現(xiàn)方法
- 最流行的java后臺(tái)框架spring quartz定時(shí)任務(wù)
- Spring Task定時(shí)任務(wù)的配置和使用詳解
- spring 定時(shí)任務(wù)@Scheduled詳解
- 詳解Spring整合Quartz實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)
- spring中定時(shí)任務(wù)taskScheduler的詳細(xì)介紹
- 詳解Spring Boot中使用@Scheduled創(chuàng)建定時(shí)任務(wù)
- Spring整合Quartz實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度的方法
- Spring定時(shí)任務(wù)實(shí)現(xiàn)與配置(二)
相關(guān)文章
詳解JAVA中implement和extends的區(qū)別
這篇文章主要介紹了詳解JAVA中implement和extends的區(qū)別的相關(guān)資料,extends是繼承接口,implement是一個(gè)類實(shí)現(xiàn)一個(gè)接口的關(guān)鍵字,需要的朋友可以參考下2017-08-08
淺談?dòng)胘ava實(shí)現(xiàn)事件驅(qū)動(dòng)機(jī)制
這篇文章主要介紹了淺談?dòng)胘ava實(shí)現(xiàn)事件驅(qū)動(dòng)機(jī)制,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
java 利用HttpClient PostMethod提交json數(shù)據(jù)操作
這篇文章主要介紹了java 利用HttpClient PostMethod提交json數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01
java基于雙向環(huán)形鏈表解決丟手帕問題的方法示例
這篇文章主要介紹了java基于雙向環(huán)形鏈表解決丟手帕問題的方法,簡(jiǎn)單描述了丟手帕問題,并結(jié)合實(shí)例形式給出了Java基于雙向環(huán)形鏈表解決丟手帕問題的步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
MVC+DAO設(shè)計(jì)模式下的設(shè)計(jì)流程詳解
這篇文章主要介紹了MVC+DAO設(shè)計(jì)模式下的設(shè)計(jì)流程詳解,分別介紹了數(shù)據(jù)庫(kù)設(shè)計(jì)、設(shè)計(jì)符合java bean標(biāo)準(zhǔn)的entity類、設(shè)計(jì)訪問數(shù)據(jù)庫(kù)的DAO接口等內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
Spring Boot部署到Tomcat過程中遇到的問題匯總
這篇文章主要給大家分享了關(guān)于Spring Boot部署到Tomcat過程中遇到的一些問題,文中將解決的方法介紹非常詳細(xì),對(duì)同樣遇到這個(gè)問題的朋友具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03

