Spring 整合 Quartz 實現動態定時任務
程式碼倉庫地址:github.com/hanglegehan…
- 動態增加定時任務
- 對定時任務進行修改
- 暫停定時任務
- 恢復暫停的定時任務
Quartz可以用來做什麼?
Quartz是一個任務排程框架。比如你遇到這樣的問題
想每月25號,信用卡自動還款
想每年4月1日自己給當年暗戀女神發一封匿名賀卡
想每隔1小時,備份一下自己的愛情動作片 學習筆記到雲盤
這些問題總結起來就是:在某一個有規律的時間點幹某件事。並且時間的觸發的條件可以非常複雜(比如每月最後一個工作日的17:50),複雜到需要一個專門的框架來幹這個事。 Quartz就是來幹這樣的事,你給它一個觸發條件的定義,它負責到了時間點,觸發相應的Job起來幹活。
但是很多時候,我們常常會遇到需要動態的新增或修改任務,而spring中所提供的定時任務元件卻只能夠通過修改xml中trigger的配置才能控制定時任務的時間以及任務的啟用或停止,這在帶給我們方便的同時也失去了動態配置任務的靈活性。最理想的是在與spring整合的同時又能實現動態任務的新增、刪除及修改配置。
ps:專案基於Maven
演示方法:用tomcat部署
1. 檢視已經部署的定時任務
http://localhost:8080/list
2. 初始化定時任務
http://localhost:8080/init
3. 暫停定時任務
http://localhost:8080/stop
4. 恢復暫停的定時任務
http://localhost:8080/resume複製程式碼
spring/spring.xml 配置
- 傳統方式
<!-- 使用MethodInvokingJobDetailFactoryBean,任務類可以不實現Job介面,通過targetMethod指定呼叫方法-->
<bean id="taskJob" class="cn.huashantech.lawyer.service.DataConversionTask"/>
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--false表示等上一個任務執行完後再開啟新的任務-->
<property name="concurrent" value="false"/>
<property name="targetObject" ref="taskJob"/>
<property name="targetMethod" value="run"/>
</bean>
<!-- 排程觸發器 -->
<bean id="myTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail"/>
<property name="cronExpression" value="0/5 * * * * ?"/>
</bean>複製程式碼
- 動態方式所需配置
<!-- 排程工廠 -->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">複製程式碼
核心類
cn.huashantech.lawyer.service.DynamicTask.Main
//以註解方式注入排程工廠
@Autowired
private Scheduler scheduler;複製程式碼
關於Quartz詳細解釋參考:www.cnblogs.com/drift-ice/p…