11

Spring Boot 中使用 Quartz 实现任务调度

 3 years ago
source link: http://www.cnblogs.com/antoniopeng/p/14190969.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Quartz 概述

Quartz 是 OpenSymphony 开源组织在 Job Scheduling 领域又一个开源项目,它可以与 J2EE、 J2SE 应用程序相结合也可以单独使用。 Quartz 可以用来创建简单或为运行十个,百个,甚至是好几万个 Jobs 这样复杂的程序。Jobs 可以做成标准的 Java 组件或 EJBs。

Quartz 使用场景

Quartz 是一个任务调度框架。比如你遇到这样的问题:

  • 每天 01:00 发送一份工作邮件给工作组成员并抄送给老板(假装自己很努力的工作到深夜)
  • 每月 2 号提醒自己还信用卡或自动还款
  • 每秒钟发 N 笔脏数据给竞争对手公司的服务器
  • ......

这些问题总结起来就是:在某一个有规律的时间点干某件事。并且时间的触发的条件可以非常复杂,复杂到需要一个专门的框架来干这个事。 Quartz 就是来干这样的事,你给它一个触发条件的定义,它负责到了时间点,触发相应的 Job 起来干活。

cron 表达式

cron 是 Linux 系统用来设置计划任务的,比如:每天晚上 12 点重启服务器。

一个 cron 表达式具体表现就是一个字符串,这个字符串中包含 6~7 个字段,字段之间是由空格分割的,每个字段可以由任何允许的值以及允许的特殊字符所构成,下面表格列出了每个字段所允许的值和特殊字符。

字段 允许值 允许的特殊字符 秒 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 在星期域里表示 “星期一、星期三、星期五”.
  • ? 字符只在日期域和星期域中使用。它被用来指定 “非明确的值”。当你需要通过在这两个域中的一个来指定一些东西的时候,它是有用的。
  • L 字符指定在月或者星期中的某天(最后一天)。即 “Last” 的缩写。但是在星期和月中 “L” 表示不同的意思,如:在月字段中 “L” 指月份的最后一天 “1月31日,2月28日”,如果在星期字段中则简单的表示为“7”或者“SAT”。如果在星期字段中在某个 value 值得后面,则表示 “某月的最后一个星期 value” ,如 “6L” 表示某月的最后一个星期五。
  • W 字符只能用在月份字段中,该字段指定了离指定日期最近的那个星期日。
  • # 字符只能用在星期字段,该字段指定了第几个星期 value 在某月中

每一个元素都可以显式地规定一个值(如 6),一个区间(如 9-12 ),一个列表(如 9,11,13 )或一个通配符(如 *)。“月份中的日期”和“星期中的日期”这两个元素是互斥的,因此应该通过设置一个问号(?)来表明你不想设置的那个字段。

Spring Boot 集成 Quartz

引入依赖

pom.xml 中引入 spring-boot-starter-quartz 依赖:

<!-- Quartz Begin -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<!-- Quartz End -->

添加注解

在入口类中添加 @EnableScheduling 注解来开启计划任务功能。

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);
    }
}

创建任务

创建一个每 5 秒钟打印当前时间的任务来测试 Quartz

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()));
    }
}

最后启动项目测试打印效果。

  • 文章作者:彭超
  • 本文首发于个人博客: https://antoniopeng.com
  • 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 彭超的博客

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK