Quartz教程四--Trigger介绍

神殇彡 于 2018-02-26 10:52:28 发布
阅读量812 收藏
点赞数
分类专栏: Quartz 文章标签: Quartz
Quartz 专栏收录该内容
9 篇文章
订阅专栏
本文详细介绍了 Quartz 中触发器(trigger)的概念及其关键属性,包括 JobKey、startTime 和 endTime 等,并深入探讨了触发器的优先级、错过触发(misfire)机制及日历(Calendar)功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录
0. Quartz教程–快速入门
1. Quartz教程一–使用Quartz
2. Quartz教程二–API、Job与Trigger
3. Quartz教程三–Job与JobDetail介绍
4. Quartz教程四–Trigger介绍
5. Quartz教程五–SimpleTrigger
6. Quartz教程六–CronTrigger
7. Quartz教程七–TriggerListener和JobListener
8. Quartz教程八–SchedulerListener

与job一样,trigger也很容易使用,但是还有一些扩展选项需要理解,以便更好地使用quartz。trigger也有很多类型,可以根据实际需要来选择。

最常用的两种trigger会分别在教程五:SimpleTriggers和教程六:CronTrigger中讲到;


Trigger的公共属性

所有类型的trigger都有TriggerKey这个属性,表示trigger的身份;除此之外,trigger还有很多其它的公共属性。这些属性,在构建trigger的时候可以通过TriggerBuilder设置。

trigger的公共属性有:

  • jobKey属性:当trigger触发时被执行的job的身份;

  • startTime属性:设置trigger第一次触发的时间;该属性的值是java.util.Date类型,表示某个指定的时间点;有些类型的trigger,会在设置的startTime时立即触发,有些类型的trigger,表示其触发是在startTime之后开始生效。比如,现在是1月份,你设置了一个trigger–”在每个月的第5天执行”,然后你将startTime属性设置为4月1号,则该trigger第一次触发会是在几个月以后了(即4月5号)。

  • endTime属性:表示trigger失效的时间点。比如,”每月第5天执行”的trigger,如果其endTime是7月1号,则其最后一次执行时间是6月5号。

其它的属性,会在下面的小节中解释。

优先级(priority)

如果你的trigger很多(或者Quartz线程池的工作线程太少),Quartz可能没有足够的资源同时触发所有的trigger;这种情况下,你可能希望控制哪些trigger优先使用Quartz的工作线程,要达到该目的,可以在trigger上设置priority属性。比如,你有N个trigger需要同时触发,但只有Z个工作线程,优先级最高的Z个trigger会被首先触发。如果没有为trigger设置优先级,trigger使用默认优先级,值为5;priority属性的值可以是任意整数,正数、负数都可以。

注意:只有同时触发的trigger之间才会比较优先级。10:59触发的trigger总是在11:00触发的trigger之前执行。

注意:如果trigger是可恢复的,在恢复后再调度时,优先级与原trigger是一样的。

错过触发(misfire)

trigger还有一个重要的属性misfire;如果scheduler关闭了,或者Quartz线程池中没有可用的线程来执行job,此时持久性的trigger就会错过(miss)其触发时间,即错过触发(misfire)。不同类型的trigger,有不同的misfire机制。它们默认都使用“智能机制(smart policy)”,即根据trigger的类型和配置动态调整行为。当scheduler启动的时候,查询所有错过触发(misfire)的持久性trigger。然后根据它们各自的misfire机制更新trigger的信息。当你在项目中使用Quartz时,你应该对各种类型的trigger的misfire机制都比较熟悉,这些misfire机制在JavaDoc中有说明。关于misfire机制的细节,会在讲到具体的trigger时作介绍。


日历(calendar)

Quartz的Calendar对象(不是java.util.Calendar对象)可以在定义和存储trigger的时候与trigger进行关联。Calendar用于从trigger的调度计划中排除时间段。比如,可以创建一个trigger,每个工作日的上午9:30执行,然后增加一个Calendar,排除掉所有的商业节日。

任何实现了Calendar接口的可序列化对象都可以作为Calendar对象,Calendar接口如下:

package org.quartz;

public interface Calendar {

  public boolean isTimeIncluded(long timeStamp);

  public long getNextIncludedTime(long timeStamp);

}

注意到这些方法的参数类型为long。你也许猜到了,他们就是毫秒单位的时间戳。即Calendar排除时间段的单位可以精确到毫秒。你也许对“排除一整天”的Calendar比较感兴趣。Quartz提供的org.quartz.impl.HolidayCalendar类可以很方便地实现。

Calendar必须先实例化,然后通过addCalendar()方法注册到scheduler。如果使用HolidayCalendar,实例化后,需要调用addExcludedDate(Date date)方法从调度计划中排除时间段。以下示例是将同一个Calendar实例用于多个trigger:

HolidayCalendar cal = new HolidayCalendar();
cal.addExcludedDate( someDate );
cal.addExcludedDate( someOtherDate );

sched.addCalendar("myHolidays", cal, false);


Trigger t = newTrigger()
 .withIdentity("myTrigger")
    .forJob("myJob")
  .withSchedule(dailyAtHourAndMinute(9, 30)) // execute job daily at 9:30
  .modifiedByCalendar("myHolidays") // but not on holidays
 .build();

// .. schedule job with trigger

Trigger t2 = newTrigger()
    .withIdentity("myTrigger2")
   .forJob("myJob2")
 .withSchedule(dailyAtHourAndMinute(11, 30)) // execute job daily at 11:30
    .modifiedByCalendar("myHolidays") // but not on holidays
 .build();

// .. schedule job with trigger2

构造trigger的细节将在接下来的几节中讲到。就现在,只需要知道上面的代码创建了两个trigger,都是每天执行一次。但是在Calendar定义的时间段内,trigger的执行被跳过。

org.quartz.impl.calendar包下有各种Calendar的实现,根据需要进行选择。

参考

  • Lesson 4: More About Triggers

转载地址 http://nkcoder.xyz/2018/01/20/quartz-tutorial-04-trigger/
确定要放弃本次机会?
福利倒计时
: :

立减 ¥

普通VIP年卡可用
立即使用
神殇彡
关注 关注
  • 0
    点赞
  • 踩
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  • 分享
    复制链接
    分享到 QQ
    分享到新浪微博
    扫一扫
  • 举报
    举报
专栏目录
参与评论 您还未登录,请先 登录 后发表或查看评论
神殇彡

博客等级

码龄15年
11
原创
11
点赞
34
收藏
7
粉丝
关注
私信

热门文章

  • Spring Cloud Gateway 内存溢出解决过程 18470
  • python django 添加前台页面 3031
  • python django模版渲染页面 2327
  • Spring Cloud Data Flow 中文版参考文档 2041
  • python django 工作流程 1584

分类专栏

  • Quartz
    9篇
  • JMS
    2篇
  • Python
    6篇
  • spring cloud
    1篇
  • gateway
    1篇
  • oom
    1篇

展开全部 收起

上一篇:
Quartz教程三--Job与JobDetail介绍
下一篇:
Quartz教程五--SimpleTrigger

最新评论

  • Spring Cloud Gateway 内存溢出解决过程

    寸发不生: 你用的是多少版本

  • Spring Cloud Gateway 内存溢出解决过程

    wangyulingreat: 为啥网上这些答案都一模一样?标点符号都不带改的

  • Spring Cloud Gateway 内存溢出解决过程

    -万里晴空-: 我升级到了 2.3.4,SR8 ,还是有问题

  • Spring Cloud Gateway 内存溢出解决过程

    faith云平台-中间件: 楼主我这里遇到一个问题,正常压测的时候,不管有问题的版本,还是新版本,在压测一段时间,内存都会趋于正常,但是我关掉,jemeter之后,就会上涨,遇到了吗

  • Spring Cloud Gateway 内存溢出解决过程

    洛水流川: 我升级到最新的版本 没这个问题了

大家在看

  • 【C/C++】面试常考题目
  • 计算机毕业设计Java基于Java的教室管理系统的设计与实现 基于 Java 的智能教室资源管理系统设计与实现 Java 驱动的校园教室综合管理平台开发
  • TDengine 基于 TDgpt 的 AI 应用实战
  • 计算机毕业设计Java基于Vue的不动产登记系统 基于Vue.js的房地产登记与管理系统开发 Vue.js驱动的不动产信息管理平台
  • 相机Camera日志分析之二十二:高通相机Camx 基于预览1帧的ConfigureStreams重要完整日志 157

最新文章

  • Spring Cloud Gateway 内存溢出解决过程
  • Spring Cloud Data Flow 中文版参考文档
  • Quartz教程八--SchedulerListener
2019年2篇
2018年9篇
2015年2篇
2013年7篇

目录

展开全部

收起

相关专栏

一起学学Java【一】

专栏

77 人学习

无论您是初学者还是资深开发者,我们以简单易懂的方式分享Java语言基础、常用框架、实用技巧等内容,助您轻松掌握编程精髓。让我们一起在编程世界中畅游,探索Java的乐趣!

Java Quartz Scheduler 入门:从“Hello, Quartz!”到深入探索

AI人工智能与大数据应用开发

专栏

1 人学习

融合AI与大数据的技术盛宴,为Java开发者开启智能应用新纪元。本专栏深入剖析大模型应用架构,从RAG到MultiAgent,从向量检索到知识库构建,全面覆盖AI应用开发核心技术。结合Java生态与大数据处理框架,打造高性能、可扩展的智能系统。理论与实践并重,抽象与落地结合,助你在AI浪潮中把握先机

Java领域里Java-EE的任务调度框架

Spring Boot从入门到实战

专栏

122 人学习

真正的干货,工作多年积累的工作实战精华,几乎囊括了工作中所有的实用技术,每篇文章都是精心编写,每篇文章都是花费2天以上才完成,作为一个java程序员这个专栏的东西你必须全部掌握。好酒不怕巷子深,你只会后悔看到的晚。

Spring Boot入门教程(四):配置文件

目录

展开全部

收起

上一篇:
Quartz教程三--Job与JobDetail介绍
下一篇:
Quartz教程五--SimpleTrigger

分类专栏

  • Quartz
    9篇
  • JMS
    2篇
  • Python
    6篇
  • spring cloud
    1篇
  • gateway
    1篇
  • oom
    1篇

展开全部 收起

目录

评论
被折叠的  条评论 为什么被折叠? 到【灌水乐园】发言
查看更多评论
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值