资讯专栏INFORMATION COLUMN

【Java定时任务调度工具】Quartz

Render / 2392人阅读

摘要:例如在周上设置表示周一三五触发用于递增触发。例如在周上设置,表示本月的最后一个星期五表示离指定日期最近那个工作日周一至周五,例如在日字段上设置,表示离每月号最近的那个工作日触发。相关例子代码较简单的定时任务调度工具利用集成

笔记来源:IMOOC Java Quartz
Quartz 简介

OpenSymphony 提供的强大的开源任务调度框架

纯 Java 实现,精细控制排程

Quartz 特点

强大的调度功能

灵活的应用方式

分布式和集群能力

主要用到的设计模式

Builder 模式

Factory 模式

组件模式

链式写法

Quartz 三个核心概念

调度器

任务

触发器

Quartz 体系结构

重要组成

Job

JobDetail

JobBuilder

JobStore

Trigger

SimpleTrigger

CronTrigger

TriggerBuilder

ThreadPool

Scheduler

Calendar

一个Trigger 可以和多个Calendar 关联,以排除或包含某些时间点

监听器

JobListener

TriggerListener

SchedulerListener

浅谈 Job

Job 定义:实现业务逻辑的任务接口

Job 接口非常容易实现,只有一个 execute 方法,类似 TimerTaskrun 方法,在里面编写业务逻辑

package org.quartz;
public interface Job {
    void execute(JobExecutionContext context) throws JobExecutionException;
}

Job 实例在 Quartz 中的生命周期

每次调度器执行 job 时,它在调用 execute 方法前会创建一个新的 job 实例

当调用完成后,关联的 job 对象实例会被释放,释放的实例会被垃圾回收机制回收

浅谈 JobDetail

JobDetail 为 Job 实例提供了许多设置属性,以及 JobDataMap 成员变量属性,它用来存储特定 Job 实例的状态信息,调度器需要借助 JobDetail 对象来添加 Job 实例。

重要属性

name

group

jobClass

jobDataMap

浅谈 JobExecutionContext

Scheduler 调用一个 Job,就会将 JobExecutionContext 传递给 Job 的 execute() 方法;

Job 能通过 JobExecutionContext 对象访问到 Quartz 运行时候的环境以及 Job 本身的明细数据。

浅谈 JobDataMap

在进行任务调度时 JobDataMap 存储在 JobExecutionContext 中,非常方便获取。

JobDataMap 可以用来装载任何可序列化的数据对象,当 job 实例对象被执行时这些参数对象会传递给它。

JobDataMap 实现了JDK的Map接口,并添加了一些非常方便的方法用来存取基本数据类型

获取 JobDataMap 的两种方式

从 Map 中直接获取

Job 实现类中添加 setter 方法对应 JobDataMap 的键值(Quartz 框架默认的 JobFactory 实现类在初始化 job 实例对象时会自动地调用这些 setter 方法)

浅谈 Trigger

Quartz 中的触发器用来告诉调度程序作业什么时候触发。即 Trigger 对象是用来触发执行 Job 的。

触发器通用属性

JobKey:表示 job 实例的标识,触发器被触发时,该指定的 job 实例会执行。

StartTime:表示触发器的时间表首次被触发的时间。它的值类型是 java.util.Date

EndTime:指定触发器的不再被触发的时间。

SimpleTrigger

在一个指定时间段执行一次作业任务,或是在指定的时间间隔多次执行作业任务。

withRepeatCount 重复次数可以是 0正整数或是 SimppleTrigger.REPEAT_INDEFINITELY 常量值。

withIntervalInSeconds 等重复执行间隔必须为 0长整数

一旦被指定了 endTime 参数,那么它会覆盖重复次数参数的效果

CronTrigger

CronTrigger 的作用:基于日历作业调度器,而不是像 SimpleTrigger 那样精确指定间隔时间,比SimpleTrigger 更常用。

Cron 表达式

用于配置 CronTrigger 实例;

是由7个表达式组成的字符串,描述了时间表的详细信息;

格式:[秒] [分] [时] [日] [月] [周] [年]

Cron 特殊字符
字段 是否必填 允许值 允许特殊字符
0~59 , - * /
0~59 , - * /
0~23 , - * /
1~31 , - * ? / L W C
1~12 或 JAN~DEC , - * /
1~7 或 SUN~SAT , - * ? / L C #
empty 1970~2099 , - * /
Cron 表达式举例
表达式 含义
0 15 10 ? 每天10点15分触发
0 0/5 14 ? 每天下午2点到2点59分(整点开始,每隔5分钟触发)
0 15 10 ? * MON-FRI 从周一到周五每天上午的10点15分触发
0 15 10 ? * 6#3 每月的第三周的星期五开始触发
0 15 10 ? 6L 2018-2019 从2018年到2019年每月最后一周的星期五10点15分触发
0/5 14,18 * ? 每天14:00:00~14:59:55、18:00:00~18:59:55,每5秒触发一次
Cron 通配符说明
特殊字符 含义
* 表示所有值。例如:在[分]的字段上设置 *,表示每一分钟都会触发
? 表示不指定值。使用的场景为不需要关系当前设置这个字段的值。例如:要在每月的10号触发一次,但不关心是周几,所有需要将[周]设置为 ?,具体设置为 0 0 0 10 * ?
- 表示区间。例如:在[时]上设置 10-12,表示10、11、12点都会触发
, 表示指定多个值。例如:在[周]上设置 MON,WED,FRI 表示周一、三、五触发
/ 用于递增触发。例如:在[秒]上设置 5/15 表示从5秒开始,每增15秒触发(5、20、35、50)。又如在[月]上设置 1/3,表示每月1号开始,每隔三天触发
L 表示最后的意思。在[日]字段上设置,表示当月的最后一天;在[周]字段上表示星期六(7 或 SAT);如果在L前加上数字,则表示该数据的最后一个。例如在[周]上设置 6L,表示“本月的最后一个星期五”
W 表示离指定日期最近那个工作日(周一至周五),例如在[日]字段上设置 15W,表示离每月15号最近的那个工作日触发。日光指定格式为 1W,则表示每月1号往后最近的工作日触发。(W前只能设置具体的数字,不允许区间-)
# +序号(表示每月的第几个周几),例如在[周]字段上设置 6#3 表示在每月的第三个周六,注意如果指定 #5,正好第五周没有周六,则不会触发该配置。(#用在母亲节和父亲节再适合不过了)

LW 可以组合使用

周字段英文字母不区分大小写,即MON和mon相同

利用工具,在线生成

浅谈 Schedule Scheduler - 工厂模式

所有的 Scheduler 实例应该由 SchedulerFactory 来创建

SchedulerFactory - StdSchedulerFactory

SchedulerFactory - DirectSchedulerFactory

Scheduler 的创建方式
SchedulerFactory sfact = new StdSchedulerFactory();
Scheduler scheduler = sfact.getScheduler();

DirectSchedulerFactory factory = DirectSchedulerFactory.getInstance();
Scheduler scheduler = factory.getScheduler();
StdSchedulerFactory

使用一组参数 Java.util.Properties 来创建和初始化 Quartz 调度器

配置参数一般存储再 quartz.properties

调用 getScheduler 方法就能创建和初始化调度器对象

Scheduler 的主要函数

Date scheduleJob(JobDetail jobDetail, Trigger trigger)

返回此后第一次执行的时间

void start() - 开始/继续执行

void standby() - 挂起

void shutdown()

shutdown(true) 表示等待所有正在执行的 job 执行完毕之后,再关闭 scheduler

shutdown(false)shutdown() 表示直接关闭 scheduler

quartz.properties 文档的位置和加载顺序

若项目无 quartz.properties,将会去 quartz.jar 包读取默认 quartz.properties

组成部分

调度器属性

org.quartz.scheduler.instanceName 属性用来区分调度器实例,可以按功能用途来给调度器起名。

org.quartz.scheduler.instanceId 属性和前者一样,也允许任何字符串,但这个值必须是在所有调度器实例中是唯一的,尤其是在一个集群当中,作为集群的唯一key。假如你想 Quartz 帮你生成这个值的话,可以设置为 AUTO

线程池属性

org.quartz.threadPool.threadCount:指定线程数,至少为1(无默认值)(一般设置为1-100直接的整数合适)

org.quartz.threadPool.threadPriority:设置线程的优先级(最大为java.lang.Thread.MAX_PRIORITY 10,最小为Thread.MIN_PRIORITY 1,默认为5)

org.quartz.threadPool.class:线程池的实现类(一般使用 SimpleThreadPool 可满足几乎所有用户的需求)

作业存储设置

描述了在调度器实例的生命周期中,Job 和 Trigger 信息是如何被存储的。

插件配置

满足特定需求用到的 Quartz 插件的配置。

相关例子代码:https://github.com/gcusky/lea...

较简单的 Java 定时任务调度工具:Timer

Akka 利用 Extension 集成 Quartz:akka-quartz-scheduler

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76422.html

相关文章

  • Java 定时任务系列(2)-Spring 定时任务的几种实现

    本文来自网络一些博客的整理(包括gong1208的博客 dary1715的博客) 1、简介 这个系列介绍Spring框架实现定时任务的两种方式以及一些高级的用法,包括: 1、使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂,稍后会详细介绍。 2、Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且...

    roadtogeek 评论0 收藏0
  • SpringBoot下使用定时任务的方式全揭秘

    摘要:定时任务间隔时间方式执行一次定时任务线程休眠规定时间类类允许调度一个任务。引入依赖配置测试执行一次定时任务使用注解是为定时任务而生的一个注解,查看注解的源码表达式接收一个。 本文旨在用通俗的语言讲述枯燥的知识 定时任务作为一种系统调度工具,在一些需要有定时作业的系统中应用广泛,如每逢某个时间点统计数据、在将来某个时刻执行某些动作...定时任务在主流开发语言均提供相应的API供开发者调用...

    DevTTL 评论0 收藏0
  • 慕课网_《Java定时任务调度工具详解之Quartz篇》学习总结

    摘要:时间年月日星期一说明本文部分内容均来自慕课网。属性任务名称任务所属组任务实现类传参的作用浅谈上是什么当调用一个,就会将传递给的方法能通过对象访问到运行时候的环境以及本身的明细数据。 时间:2017年06月26日星期一说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码...

    hiYoHoo 评论0 收藏0
  • 慕课网_《Java定时任务调度工具详解之Timer篇》学习总结

    时间:2017年05月24日星期三说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:无个人学习源码:https://github.com/zccodere/s... 第一章:课程介绍 1-1 课程介绍 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务 在Java中的定时调度工具 Timer:小弟,能实现日常60%的定...

    wind5o 评论0 收藏0
  • 那些年,我们追过的“定时调度

    摘要:类是一个抽象类,由安排为一次执行或重复执行的任务。也是自带的一个基于线程池设计的定时任务类。问题,则可以直接使用类实现自定义的定时调度规则。 定时调度作为后端开发人员,我们总会遇到这样的业务场景:每周同步一批数据;每半个小时检查一遍服务器运行状况;每天早上八点给用户发送一份包含今日待办事项的邮件,等等。 这些场景中都离不开定时器,就像一个定好时间规则的闹钟,它会在指定时间触发,执行我们...

    The question 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<