首頁 >Java >java教程 >如何使用Quartz實作Java高可用定時任務?

如何使用Quartz實作Java高可用定時任務?

WBOY
WBOY轉載
2023-05-07 12:55:071344瀏覽

定時任務使用指南

如果你想做定時任務,有高可用方面的需求,或者僅僅想入門快,上手簡單,那麼可選它準沒錯。

定時任務模組是對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腳本,注意初始化資料庫

以上是如何使用Quartz實作Java高可用定時任務?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除