spring boot 和定时框架Quartz的整合

项目中经常要使用定时执行的任务,我们可以使用JDK自带的java.util.Timer结合java.util.TimerTask来完成这项工作,但时调度控制非常不方便,并且我们需要大量的代码。我们就使用Quartz框架来实现持久化的定时任务。

先来了解一下Quartz框架的一些信息

Quartz API 主要包含了以下接口

Scheduler – 调度器,任务调度的主 API。

Job – 由调度器调度的任务需要实现的接口。

JobDetail – 用于定义任务的实例。

Trigger – 用于定义需要执行的任务和任务的执行时间。

JobBuilder – 用于定义/创建 JobDetail 实例。

TriggerBuilder – 用于定义/创建 Trigger 对象。

Scheduler(调度器)的生命周期由 SchedulerFactory 创建 Scheduler 开始到调用 shutdown() 结束。

一旦创建了 Scheduler 实例,就可以新增,移除,查看 Job 和 Trigger,和执行其它调度相关工作(例如暂停 Trigger)。

如果 Scheduler 没有调用 start() 方法,那么将不会执行任何 Trigger 上的任务。

Quartz 定义了 builder 类,它们定义了 Domain Specific Language(DSL,有时也成为“流式接口”)。

ScheduleBuilder 有多个变体,用于定义不同类型的周期。

Quartz- Quartz API以åJobs åTriggersä»ç»

DateBuilder 中包含了大量的方法方便创建 java.util.Date 实例来指定时间。

Jobs 和 Triggers任务需要实现 Job 接口,接口中只有一个方法:


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

当任务的 Trigger 被触发,任务的 execute 方法将会由调度器的一个工作线程调用。传入这个方法的 JobExecutionContext 对象用于提供任务运行环境的信息(包含了一个 Scheduler 的句柄,一个Trigger 的句柄,一个 JobDetail 的句柄和几个其它项)。

JobDetail 由 Quartz 客户端创建(你自己编写)。它包含了大量的任务属性设置和 JobMetaMap 对象(可用于存储任务的状态信息)。这个类本质上来说是用于定义 Job 对象。

Trigger 是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。对象用于触发任务的执行。它定义了任务的执行时间。当你创建了一个 Trigger,你需要提供你需要的时间表(schedule)用于控制任务的执行。Trigger 可能还包含了 JobDataMap 对象,当你需要传递参数给 Job 的时候,这个类就相当有用。Quartz 提供了几个 Trigger 的实现,其中最常用的是 SimpleTrigger 和 CronTrigger

SimpleTrigger 用于执行某个时间点执行一次的任务,或用于在某个时间执行一次任务,并且在 T 周期重复执行 N 次。CronTrigger 用于基于日历的任务,例如“每周五中午”或“每个月10号上午10点15分”执行。

为什么需要 Job 和 Trigger。有些任务调度方案没有分离 job 和 trigger,为什么 Quartz 需要分别定义 Job 和 Trigger 呢。主要基于以下考虑。

多个 Job 可以保存到同一个 Trigger,多个 Trigger 也可以关联到相同的 Job。这种松耦合的设计的另外一个好处是可以在 trigger 过期后配置任务到调度器中,方便以后重新开始任务,而不用再次定义任务。也允许在不更换任务的情况下更改和替换 Trigger。

唯一标识:Jobs 和 Triggers 可以使用 Quartz 调度器注册一个唯一标识。Job 和 Trigger 的键(JobKey 和 TriggerKey)允许进行分组,这对于任务和触发器来说非常易于组织成像“报表任务”或“维护任务”这样的分组。 分组中的键必须唯一。

Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,两者在Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法,允许外部通过组及名称访问和控制容器中Trigger和JobDetail。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值