學(xué)習(xí)完整課程請移步 互聯(lián)網(wǎng) Java 全棧工程師
本節(jié)視頻
概述
Quartz 是 OpenSymphony 開源組織在 Job Scheduling 領(lǐng)域又一個開源項目秋忙,它可以與 J2EE 與 J2SE 應(yīng)用程序相結(jié)合也可以單獨使用。Quartz 可以用來創(chuàng)建簡單或為運(yùn)行十個,百個,甚至是好幾萬個 Jobs 這樣復(fù)雜的程序。Jobs 可以做成標(biāo)準(zhǔn)的 Java 組件或 EJBs订咸。
為什么使用 Quartz?
Quartz 是一個任務(wù)調(diào)度框架。比如你遇到這樣的問題:
- 每天 02:00 發(fā)送一份工作郵件給工作組成員并抄送給老板(假裝自己很努力的工作到深夜)
- 每月 2 號提醒自己還信用卡或自動還款
- 每秒鐘發(fā) N 筆臟數(shù)據(jù)給競爭對手公司的服務(wù)器(团滥!←_←)
這些問題總結(jié)起來就是:在某一個有規(guī)律的時間點干某件事。并且時間的觸發(fā)的條件可以非常復(fù)雜报强,復(fù)雜到需要一個專門的框架來干這個事灸姊。Quartz 就是來干這樣的事,你給它一個觸發(fā)條件的定義秉溉,它負(fù)責(zé)到了時間點力惯,觸發(fā)相應(yīng)的 Job 起來干活(睡 NMB 起來嗨!)召嘶。
什么是 cron 表達(dá)式父晶?
cron 是 Linux 系統(tǒng)用來設(shè)置計劃任務(wù)的,比如:每天晚上 12 點重啟服務(wù)器弄跌。
格式
一個 cron 表達(dá)式具體表現(xiàn)就是一個字符串甲喝,這個字符串中包含 6~7 個字段,字段之間是由空格分割的铛只,每個字段可以由任何允許的值以及允許的特殊字符所構(gòu)成埠胖,下面表格列出了每個字段所允許的值和特殊字符
字段 | 允許值 | 允許的特殊字符 |
---|---|---|
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
小時 | 0-23 | , - * / |
日期 | 1-31 | , - * / L W C |
月份 | 1-12 或者 JAN-DEC | , - * / |
星期 | 1-7 或者 SUN-SAT | , - * / L C # |
年(可選) | 留空, 1970-2099 | , - * / |
*
字符被用來指定所有的值。如:*
在分鐘的字段域里表示“每分鐘”格仲。-
字符被用來指定一個范圍押袍。如:10-12
在小時域意味著“10點、11點凯肋、12點”,
字符被用來指定另外的值谊惭。如:MON,WED,FRI
在星期域里表示“星期一、星期三、星期五”.?
字符只在日期域和星期域中使用圈盔。它被用來指定“非明確的值”豹芯。當(dāng)你需要通過在這兩個域中的一個來指定一些東西的時候,它是有用的驱敲。L
字符指定在月或者星期中的某天(最后一天)铁蹈。即 “Last” 的縮寫。但是在星期和月中 “L” 表示不同的意思众眨,如:在月字段中 “L” 指月份的最后一天 “1月31日握牧,2月28日”,如果在星期字段中則簡單的表示為“7”或者“SAT”娩梨。如果在星期字段中在某個 value 值得后面沿腰,則表示 “某月的最后一個星期 value” ,如 “6L” 表示某月的最后一個星期五。W
字符只能用在月份字段中狈定,該字段指定了離指定日期最近的那個星期日颂龙。#
字符只能用在星期字段,該字段指定了第幾個星期 value 在某月中
每一個元素都可以顯式地規(guī)定一個值(如 6)纽什,一個區(qū)間(如 9-12 )措嵌,一個列表(如 9,11芦缰,13 )或一個通配符(如 *)企巢。“月份中的日期”和“星期中的日期”這兩個元素是互斥的饺藤,因此應(yīng)該通過設(shè)置一個問號(?)來表明你不想設(shè)置的那個字段包斑。
表達(dá)式 | 意義 |
---|---|
0 0 12 * * ? |
每天中午 12 點觸發(fā) |
0 15 10 ? * * |
每天上午 10:15 觸發(fā) |
0 15 10 * * ? |
每天上午 10:15 觸發(fā) |
0 15 10 * * ? * |
每天上午 10:15 觸發(fā) |
0 15 10 * * ? 2005 |
2005 年的每天上午 10:15 觸發(fā) |
0 * 14 * * ? |
在每天下午 2 點到下午 2:59 期間的每 1 分鐘觸發(fā) |
0 0/5 14 * * ? |
在每天下午 2 點到下午 2:55 期間的每 5 分鐘觸發(fā) |
0 0/5 14,18 * * ? |
在每天下午 2 點到 2:55 期間和下午 6 點到 6:55 期間的每 5 分鐘觸發(fā) |
0 0-5 14 * * ? |
在每天下午 2 點到下午 2:05 期間的每 1 分鐘觸發(fā) |
0 10,44 14 ? 3 WED |
每年三月的星期三的下午 2:10 和 2:44 觸發(fā) |
0 15 10 ? * MON-FRI |
周一至周五的上午 10:15 觸發(fā) |
0 15 10 15 * ? |
每月 15 日上午 10:15 觸發(fā) |
0 15 10 L * ? |
每月最后一日的上午 10:15 觸發(fā) |
0 15 10 ? * 6L |
每月的最后一個星期五上午 10:15 觸發(fā) |
0 15 10 ? * 6L 2002-2005 |
2002 年至 2005 年的每月的最后一個星期五上午 10:15 觸發(fā) |
0 15 10 ? * 6#3 |
每月的第三個星期五上午 10:15 觸發(fā) |
Spring Boot 集成 Quartz
創(chuàng)建項目
創(chuàng)建一個名為 hello-quartz
的項目
POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.funtl</groupId>
<artifactId>hello-quartz</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>hello-quartz</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
主要增加了 org.springframework.boot:spring-boot-starter-quartz
依賴
Application
package com.funtl.hello.quatrz;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@SpringBootApplication
public class HelloQuatrzApplication {
public static void main(String[] args) {
SpringApplication.run(HelloQuatrzApplication.class, args);
}
}
使用 @EnableScheduling
注解來開啟計劃任務(wù)功能
創(chuàng)建任務(wù)
我們創(chuàng)建一個每 5 秒鐘打印當(dāng)前時間的任務(wù)來測試 Quartz
package com.funtl.hello.quatrz.tasks;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
public class PrintCurrentTimeTask {
@Scheduled(cron = "0/5 * * * * ? ")
public void printCurrentTime() {
System.out.println("Current Time is:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
啟動服務(wù),控制臺打印效果如下: