定時任務使用指南 如果你想做定時任務,有高可用方面的需求,或者僅僅想入門快,上手簡單,那麼選用它準沒錯。 定時任務模塊是對Quartz框架進一步封裝,使用更加簡潔。 1、引入依賴 <dependency> <groupId>xin.altitude.cms</groupId> <artifactId ...
定時任務使用指南
如果你想做定時任務,有高可用
方面的需求,或者僅僅想入門快
,上手簡單,那麼選用它準沒錯。
定時任務模塊是對Quartz框架進一步封裝,使用更加簡潔。
1、引入依賴
<dependency>
<groupId>xin.altitude.cms</groupId>
<artifactId>ucode-cms-quartz</artifactId>
<version>1.5.4.1</version>
</dependency>
2、快速上手
實現org.quartz.Job
介面;使用註解CronExp
添加任務的調度策略;使用註解Component
將任務註入容器中。
啟動項目,定時任務便處於監聽與運行中。
@Component
@DisallowConcurrentExecution
@CronExp(cron = "0/5 * * * * ?")
public class DemoJob implements Job {
@Override
public void execute(JobExecutionContext context) {
System.out.println("任務1:" + LocalDateTime.now());
}
}
3、手動觸發定時任務
定時任務除了以既有頻率周期性運行外,還有通過介面手動被觸發的能力。
調用如下介面,可手動觸發任務ID編號為jobId
的任務。
http://localhost:8080/cms-api/quartz/job/{jobId}
如果有手動觸發定時任務的需求,則需要任務ID唯一併
且已知
,因此需要在編寫定時任務時手動指定。
@CronExp(id = 1, cron = "0/5 * * * * ?")
通過註解CronExp
的id屬性可指定任務ID,不顯示指定則使用隨機ID,不滿足已知的條件,因此無法手動觸發。
4、帶參數任務
儘管大多數任務不需要註入參數,但仍有少量的場景需要向定時任務註入參數。
public void execute(JobExecutionContext context) {
/* 如果在調用任務時傳入了參數,則能夠從Map中獲取 */
Map<String, Object> dataMap = context.getMergedJobDataMap();
/* 比如從Map中獲取一個鍵值對,一般來說參數均為基本數據類型 */
Object key = dataMap.get("key");
System.out.println("任務2:" + LocalDateTime.now() + ": " + key);
}
在編寫定時任務時,可從JobExecutionContext
對象中解析一個Map,從而完成參數的註入。
http://localhost:8080/cms-api/quartz/job/1?key=a
上述http調用的含義是手動觸發任務ID為【1】的任務,並且向其傳遞參數為【key】值為【a】的參數。
5、任務併發
本框架不支持任務併發,換句話說併發對定時任務不利,因此需要手動禁止。
需要註意的是Quartz
的併發是指當任務執行耗時超過任務調度周期時,上一個任務未執行完,新任務是否執行。
一般來說需要顯示禁止併發,在任務類上添加註解DisallowConcurrentExecution
即可禁止任務併發。
6、持久化
如果定時任務有高可用的需求,那麼需要對任務進行持久化。定時任務數據持久化到資料庫中後,支持應用程式多開。定時任務持久化多節點部署後,集群中單節點故障不影響定時任務的執行。
定時任務持久化,僅需修改yml文件配置即可達到目標,無需修改代碼。一般而言使用Mysql做持久化的容器。
spring:
quartz:
properties:
org.quartz.jobStore.isClustered: true
org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource: qzDS
org.quartz.dataSource.qzDS.driver: com.mysql.cj.jdbc.Driver
org.quartz.dataSource.qzDS.URL: jdbc:mysql://localhost:3306/quartz-demo
org.quartz.dataSource.qzDS.user: root
org.quartz.dataSource.qzDS.password: 123456
除了修改主機、埠、資料庫名、用戶名、密碼五個參數外,其餘參數使用預設值即可。
配置完資料庫連接後,使用SQL腳本,註意初始化資料庫
喜歡本文就【♥️推薦♥️】一下,激勵我持續創作。這個Github同樣精彩,收到您的star我會很激動。本文歸檔在專題博客,視頻講解在B站。