天天看點

datax 定時執行多個job_Spring Boot如何整合Quartz 實作定時任務

在項目開發中,經常需要定時任務來背景處理業務,比如定時生成資料報表、生成對賬單、資料監控等。Spring Boot 中有兩種方案可以選擇,第一種是 Spring Boot 内置的注解方式實作,這個方式之前介紹過了,可以看我這篇文章《Spring Boot入門系列(八)整合定時任務Task,一秒搞定定時任務》,如果需要更複雜的應用場景那麼就需要Quartz 實作, Quartz是目前最完善的定時任務架構。接下來一起學習Spring Boot如何整合Quartz 實作定時任務。

datax 定時執行多個job_Spring Boot如何整合Quartz 實作定時任務

一、 Quartz 介紹

Quartz 是非常流行的開源任務排程管理,它是由 Java 開發,具有使用靈活、配置簡單的特點。能夠實作複雜的應用場景下的任務排程管理。

Quartz 中,有幾個非常重要的概念: Job(任務)、 JobDetail(任務資訊)、 Trigger(觸發器)和Scheduler(排程器),隻有熟悉這幾個概念,才能明白 Quartz 怎麼用。

(1) Job:是個接口,隻有一個 execute方法,在實作接口的execute 方法中編寫所需要定時執行的 功能;Job 運作時的資訊儲存在 JobDataMap 執行個體中。

(2) JobDetail: Quartz 每次排程 Job 時,都建立一個 Job 執行個體。它主要記錄 Job 任務的相關基本資訊(如 Job 名字、描述、關聯監聽器等資訊),以便運作時通過 newInstance() 的反射機制執行個體化 對應的Job任務。

(3) Trigger:是一個觸發類,描述觸發 Job 執行的觸發規則,主要有 SimpleTrigger 和 CronTrigger 這兩個類。SimpleTrigger 主要用于任務以固定時間間隔周期執行,而 CronTrigger 則可以通過 Cron 表達式定義出各種複雜時間規則的排程方案,如:設定任務每周一到周五的 15: 00~ 16: 00 執行等。

(4) Scheduler:就相當于一個獨立運作容器,裝載着任務和觸發器 , 可以将 Trigger 和 JobDetail 注冊到 Scheduler 中, Scheduler 定義了多個接口方法,允許外部通過組及名稱通路和控制容器中 Trigger 和 JobDetail。

四者其關系如下圖所示:

datax 定時執行多個job_Spring Boot如何整合Quartz 實作定時任務

二、整合Quartz

Spring Boot 2.0 提供了 spring-boot-starter-quartz 元件,它內建 Quartz 架構,讓我們在項目中使用 Quartz 變得非常簡單。

1、配置 pom.xml

         org.springframework.boot         spring-boot-starter-quartz
           

Spring Boot 整合 quartz 非常簡單,隻需在pom.xml 檔案中增加 quartz 依賴即可,無需其他配置。

三、建立簡單任務

1、首先定義一個 Job 需要繼承 QuartzJobBean,示例中 Job 定義一個變量 Name,用于在定時執行的時候傳入。

public class SampleJob extends QuartzJobBean {         private String name;         public void setName(String name) {                   this.name = name;         }         @Override         protected void executeInternal(JobExecutionContext context)                            throws JobExecutionException {                   System.out.println(String.format("Hello %s!", this.name));         }       }
           

2、然後建構 JobDetail,并且建構時傳入 name 屬性的值,建構 JobTrigger 和 scheduleBuilder,最後使用Scheduler 啟動定時任務。

@Configurationpublic class SampleScheduler {         @Bean         public JobDetail sampleJobDetail() {                   return JobBuilder.newJob(SampleJob.class).withIdentity("sampleJob")                                     .usingJobData("name", "World").storeDurably().build();         }         @Bean         public Trigger sampleJobTrigger() {                   SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()                                     .withIntervalInSeconds(2).repeatForever();                   return TriggerBuilder.newTrigger().forJob(sampleJobDetail())                                     .withIdentity("sampleTrigger").withSchedule(scheduleBuilder).build();         }}
           

啟動項目後每隔兩秒輸出:

Hello World!Hello World!Hello World!. . .
           

JobBuilder 構構造函數,隻能通過 JobBuilder 的靜态方法 newJob() 生成成 JobBuilder 執行個體。

withIdentity 方法可以傳入兩個參數 withIdentity(String name,String group) 來定義 TriggerKey,也可以不設定,像上一示例中會自動生成一個獨一無二的 TriggerKey 來區分不同的 Trigger。

以上是建立簡單的任務,任務以固定時間間隔周期執行。

四、建立cron定時任務

CronSchedule 可以設定更靈活的使用方式,定時設定可以參考上面的 cron 表達式。

1、首先定義兩個 Job

public class ScheduledJob implements Job {     @Override     public void execute(JobExecutionContext context)                        throws JobExecutionException{               System.out.println("schedule job1 is running ...");     }}
           

2、建構 jobDetail、 CronTrigger,最後使用 scheduler 關聯 jobDetail 和CronTrigger。 scheduleJob1 設定每間隔 6 秒執行一次。

private void scheduleJob1(Scheduler scheduler) throws SchedulerException{ JobDetail jobDetail = JobBuilder.newJob(ScheduledJob.class) .withIdentity("job1", "group1").build();CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/6 * * * * ?");CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1","group1").withSchedule(scheduleBuilder).build();scheduler.scheduleJob(jobDetail,cronTrigger);}
           

CronScheduleBuilder.cronSchedule("0/6 * * * * ?"),按照 cron 表達式設定定時任務的執行周期。

3、觸發定時任務

public void scheduleJobs() throws SchedulerException {         Scheduler scheduler = schedulerFactoryBean.getScheduler();         scheduleJob1(scheduler);         scheduleJob2(scheduler);}
           

最後

以上,就把Spring Boot內建Quartz,實作定時任務。還是比較簡單的。還有一個比較重要的點是cron 表達式。這個後面會單獨介紹。

這個系列課程的完整源碼,也會提供給大家。大家私信我(章為忠學架構)。擷取這個系列課程的完整源碼。

推薦閱讀:

Spring Boot入門系列(八)整合定時任務Task,一秒搞定定時任務

Spring Boot入門系列(十五)Spring Boot 開發環境熱部署的配置

Spring Boot 使用JdbcTemplate操作資料庫,配置多資料源

Maven快速入門(二)手動建立maven項目hellomaven

Maven快速入門(一)Maven介紹及環境搭建

史上最強《Java 開發手冊》泰山版,阿裡出品,必屬精品

Spring Boot入門系列(十三)如何實作事務,極簡版!

繼續閱讀