Quartz

1 簡介

Quartz是一個徹底由java編寫的開源做業調度框架。java

經過觸發器設置做業定時運行規則、控制做業的運行時間。spring

Quartz定時器的做用不少,好比定時發送信息、定時器生成報表。框架

2 核心組件

2.1 Quartz框架的核心對象

  • Scheduler – 核心調度器maven

  • Job – 任務ide

  • JobDetail – 任務描述spring-boot

  • Trigger -- 觸發器ui


 

Job是一個接口,藉口中只有一個execute()方法,具體的任務類須要實現該接口的該方法。spa

public interface Job {
   void execute(JobExecutionContext context)
       throws JobExecutionException;

}

 


 

2.2 對象之間的關係

 

3 使用Quartz以前的準備

3.1 創建一個Maven項目

3.2 引入quartz依賴

使用quartz,咱們僅僅須要在maven的pom文件中添加依賴便可。我使用的是如今最新的一個版本2.3.0。3d

<dependency>
   <groupId>org.quartz-scheduler</groupId>
   <artifactId>quartz</artifactId>
   <version>2.3.0</version>
</dependency>

 

4 編寫第一個Quartz任務案例

這個任務主要是每2秒打印一次HelloQuartz。orm

先實現一下這個基本的Quartz的任務再來介紹一下Quartz的3個重要組成,JobDetail,Trigger,Scheduler。

4.1 建立一個類HelloJob.java

這個類是咱們具體要實現的任務(打印Hello Quartz)

package com.example;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
* @Auther: wuyilong
* @Date: 2019/3/20 09:27
* @Description: 打印Hello Quartz
*/
public class HelloJob implements Job {
   
   @Override
   public void execute(JobExecutionContext context) throws JobExecutionException {
       Date date = new Date();
       SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       System.out.println(sf.format(date));
       // 具體的任務
       System.out.println("Hello Quartz");

  }
}

4.2 建立HelloScheduler.java,這個是具體觸發咱們的任務

建立HelleScheduler的步驟:

  1. 建立調度工廠();    //工廠模式

  2. 根據工廠取得調度器實例();   //工廠模式

  3. Builder模式構建子組件<Job,Trigger>    // builder模式, 如JobBuilder、TriggerBuilder、DateBuilder

  4. 經過調度器組裝子組件 調度器.組裝<子組件1,子組件2...>   //工廠模式

  5. 調度器.start();   //工廠模式


 

public class HelloScheduler {
   
   public static void main(String[] args) throws SchedulerException {
       //建立一個jobDetail的實例,將該實例與HelloJob Class綁定
       JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob").build();
       //建立一個Trigger觸發器的實例,定義該job當即執行,而且每2秒執行一次,一直執行
       SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();
       //建立schedule實例
       StdSchedulerFactory factory = new StdSchedulerFactory();
       Scheduler scheduler = factory.getScheduler();
       scheduler.start();
       scheduler.scheduleJob(jobDetail,trigger);

  }
}

 

5 cron表達式編寫規則

5.1 Quartz Cron 表達式支持7個域 ,分別是秒/分/時/日/月/周/年。

名稱 是否必須 容許值 特殊字符
0-59 , - * /
0-59 , - * /
0-23 , - * /
1-31 , - * ? / L W C
1-12 或 JAN-DEC , - * /
1-7 或 SUN-SAT , - * ? / L C #
空 或 1970-2099 , - * /

 

5.2 官方的一些案例

表示式 說明
0 0 12 * * ? 天天12點運行
0 15 10 ? * * 天天10:15運行
0 15 10 * * ? 天天10:15運行
0 15 10 * * ? * 天天10:15運行
0 15 10 * * ? 2008 在2008年的天天10:15運行
0 * 14 * * ? 天天14點到15點之間每分鐘運行一次,開始於14:00,結束於14:59。
0 0/5 14 * * ? 天天14點到15點每5分鐘運行一次,開始於14:00,結束於14:55。
0 0/5 14,18 * * ? 天天14點到15點每5分鐘運行一次,此外天天18點到19點每5鍾也運行一次。
0 0-5 14 * * ? 天天14:00點到14:05,每分鐘運行一次。
0 10,44 14 ? 3 WED 3月每週三的14:10分到14:44,每分鐘運行一次。
0 15 10 ? * MON-FRI 每週一,二,三,四,五的10:15分運行。
0 15 10 15 * ? 每個月15日10:15分運行。
0 15 10 L * ? 每個月最後一天10:15分運行。
0 15 10 ? * 6L 每個月最後一個星期五10:15分運行。
0 15 10 ? * 6L 2007-2009 在2007,2008,2009年每月的最後一個星期五的10:15分運行。
0 15 10 ? * 6#3 每個月第三個星期五的10:15分運行。

6 SpringBoot2集成Quartz

 


 

 

6.1 Maven文件

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

6.2 編寫任務類

package com.example.task;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

/**
* @Auther: wuyilong
* @Date: 2019/3/20 10:32
* @Description:
*/
public class MjtTask extends QuartzJobBean {
   @Override
   protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
       System.out.println("開始定時計時");
  }
}

6.3 編寫配置類

package com.example.config;

import com.example.task.MjtTask;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* @Auther: wuyilong
* @Date: 2019/3/20 10:33
* @Description:
*/
@Configuration
public class QuartzConfig {

   @Bean
   public JobDetail uploadTaskDetail() {
       return JobBuilder.newJob(MjtTask.class).withIdentity("mjtTask").storeDurably().build();
  }

   @Bean
   public Trigger uploadTaskTrigger() {
       CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("*/5 * * * * ?");
       return TriggerBuilder.newTrigger().forJob(uploadTaskDetail()).withIdentity("mjtTask")
              .withSchedule(scheduleBuilder).build();
  }
}

6.4 運行結果

 

相關文章
相關標籤/搜索