初识Quartz之Trigger组件

Quartz(2-Trigger) Quartz触发器Trigger介绍,自定义任务的执行时间 阅读详情

        前文已经介绍了Job组件,本文介绍Trigger组件,其实Trigger组件关系网与Job组件关系网类似。

1.trigger接口

        首先Trigger是个接口,继承了Serializable、Cloneable、Comparable接口。

public interface Trigger extends Serializable, Cloneable, Comparable<Trigger>

        可以看出该Trigger接口与JobDetail接口的不同之处在于继承了Comparable接口,并且在Trigger接口内部有一个内部类TriggerTimeComparator类,该类的主要目的是为了给触发器进行排序,

class TriggerTimeComparator implements Comparator<Trigger>, Serializable {
      
        private static final long serialVersionUID = -3904243490805975570L;
        
        // This static method exists for comparator in TC clustered quartz
        public static int compare(Date nextFireTime1, int priority1, TriggerKey key1, Date nextFireTime2, int priority2, TriggerKey key2) {
            if (nextFireTime1 != null || nextFireTime2 != null) {
                if (nextFireTime1 == null) {
                    return 1;
                }

                if (nextFireTime2 == null) {
                    return -1;
                }

                if(nextFireTime1.before(nextFireTime2)) {
                    return -1;
                }

                if(nextFireTime1.after(nextFireTime2)) {
                    return 1;
                }
            }

            int comp = priority2 - priority1;
            if (comp != 0) {
                return comp;
            }

            return key1.compareTo(key2);
        }

        以上这个类是一个比较器,用于比较触发器的下一次触发时间,或者换言之,根据最早的下一次触发时间对它们进行排序。 如果触发时间相同,则根据优先级(最高值优先)对触发器进行排序,如果优先级相同,则按键排序。所以这是在使用多个触发器的时候用于触发器执行先后的比较器。

2.TriggerBuilder类

        由于Trigger是个接口,因此Trigger的对象创建不能直接使用Trigger接口创建实例,因此通过调用TriggerBuilder类进行创建实例,首先调用TriggerBuilder的类方法,该方法封装了TriggerBuilder对象的创建过程。

 public static TriggerBuilder<Trigger> newTrigger() {
        return new TriggerBuilder<Trigger>();
    }

        然后调用TriggerBuilder实例方法withIdentity方法,并为触发器命名与分组。该方法封装了创建TriggerKey对象的过程。

public TriggerBuilder<T> withIdentity(String name) {
        key = new TriggerKey(name, null);
        return this;
    }  
    
    /**
     * Use a TriggerKey with the given name and group to
     * identify the Trigger.
     * 
     * <p>If none of the 'withIdentity' methods are set on the TriggerBuilder,
     * then a random, unique TriggerKey will be generated.</p>
     * 
     * @param name the name element for the Trigger's TriggerKey
     * @param group the group element for the Trigger's TriggerKey
     * @return the updated TriggerBuilder
     * @see TriggerKey
     * @see Trigger#getKey()
     */
    public TriggerBuilder<T> withIdentity(String name, String group) {
        key = new TriggerKey(name, group);
        return this;
    }
    
    /**
     * Use the given TriggerKey to identify the Trigger.  
     * 
     * <p>If none of the 'withIdentity' methods are set on the TriggerBuilder,
     * then a random, unique TriggerKey will be generated.</p>
     * 
     * @param triggerKey the TriggerKey for the Trigger to be built
     * @return the updated TriggerBuilder
     * @see TriggerKey
     * @see Trigger#getKey()
     */
    public TriggerBuilder<T> withIdentity(TriggerKey triggerKey) {
        this.key = triggerKey;
        return this;
    }

        TriggerKey继承了Key,构造函数继承了父类构造函数。

public final class TriggerKey extends Key<TriggerKey> {
  
    private static final long serialVersionUID = 8070357886703449660L;

    public TriggerKey(String name) {
        super(name, null);
    }

    public TriggerKey(String name, String group) {
        super(name, group);
    }

    public static TriggerKey triggerKey(String name) {
        return new TriggerKey(name, null);
    }
    
    public static TriggerKey triggerKey(String name, String group) {
        return new TriggerKey(name, group);
    }
    
}

        以下是Key的构造函数的源码,其中name是必须的,而group是可以为null,如果为null,默认值为DEFAULT_GROUP,这也解释了TriggerBuilder类中有重载的withIdentity方法,其中就有group参数缺省的,但是没有name参数缺省的。

public Key(String name, String group) {
        if(name == null)
            throw new IllegalArgumentException("Name cannot be null.");
        this.name = name;
        if(group != null)
            this.group = group;
        else
            this.group = DEFAULT_GROUP;
    }

        因此从上面可以知道,调用TriggerBuilder的withIdentity方法就可以并可以绑定触发器的名字与分组两个参数,并且返回的是TriggerBuilder对象。

3.触发器的启动设置

        以上创建了TriggerBuilder对象,因此在创建Trigger对象过程中还需要做启动相关的设置,比如何时启动,何时结束,以及触发频率等设置。

        首先是何时启动的设置,TriggerBuilder中提供了两个实例方法,startAt(Date startTime)和startNow(),前者根据传入的具体时间进行确定启动时间,而后者则是即刻启动。

 public TriggerBuilder<T> startAt(Date triggerStartTime) {
        this.startTime = triggerStartTime;
        return this;
    }
    
    /**
     * Set the time the Trigger should start at to the current moment - 
     * the trigger may or may not fire at this time - depending upon the 
     * schedule configured for the Trigger.  
     * 
     * @return the updated TriggerBuilder
     * @see Trigger#getStartTime()
     */
    public TriggerBuilder<T> startNow() {
        this.startTime = new Date();
        return this;
    }

        至于何时结束,TriggerBuilder提供了一个endAt(Date triggerEndTime)方法,该方法主要确定了该触发器终止时间。

public TriggerBuilder<T> endAt(Date triggerEndTime) {
        this.endTime = triggerEndTime;
        return this;
    }

        TriggerBuilder提供了withSchedule(ScheduleBuilder<SBT> schedBuilder)方法用于设置触发频率等设置。

public <SBT extends T> TriggerBuilder<SBT> withSchedule(ScheduleBuilder<SBT> schedBuilder) {
        this.scheduleBuilder = schedBuilder;
        return (TriggerBuilder<SBT>) this;
    }

        可以看出withSchedule的方法中传入的是ScheduleBuilder对象,以下是ScheduleBuilder抽象类。有一个抽象方法build。

public abstract class ScheduleBuilder<T extends Trigger>  {
    
    protected abstract MutableTrigger build();

}

    ScheduleBuilder有两个类叫做SimpleScheduleBuilder和CronScheduleBuilder,这其实表示两种调度器。以SimpleScheduleBuilder为例,该类有一个类方法用于封装创建ScheduleBuilder对象,该方法如下:

 public static SimpleScheduleBuilder simpleSchedule() {
        return new SimpleScheduleBuilder();
    }
    

    其中SimpleScheduleBuilder有许多实例方法,用于触发频率的控制。比如:withIntervalInSeconds(int intervalInSeconds)、withIntervalInMinutes(int intervalInMinutes)等等,用于调度器的相关参数的设置。其中有一个

        根据以上方法将ScheduleBuilder对象传入以及调度器相关配置传入Trigger对象的withSchedule方法完成对Trigger对象有关调度器的配置。最后调用Trigger对象的build()方法,该方法返回的是Trigger对象,从而实现Trigger对象的创建。

public T build() {

        if(scheduleBuilder == null)
            scheduleBuilder = SimpleScheduleBuilder.simpleSchedule();
        MutableTrigger trig = scheduleBuilder.build();
        
        trig.setCalendarName(calendarName);
        trig.setDescription(description);
        trig.setStartTime(startTime);
        trig.setEndTime(endTime);
        if(key == null)
            key = new TriggerKey(Key.createUniqueName(null), null);
        trig.setKey(key); 
        if(jobKey != null)
            trig.setJobKey(jobKey);
        trig.setPriority(priority);
        
        if(!jobDataMap.isEmpty())
            trig.setJobDataMap(jobDataMap);
        
        return (T) trig;
    }

        以上方法表示,如果ScheduleBuilder对象为空,先对其进行初始化对象,然后创建一个Trigger对象,该对象是MutableTrigger类型的,通过ScheduleBuilder对象的Build()方法实现创建Trigger对象,然后对其进行绑定一些Trigger相关的信息。以下是ScheduleBuilder对象的实例方法build,该方法返回的是MutableTrigger类型对象,用于创建Trigger对象。

public MutableTrigger build() {

        SimpleTriggerImpl st = new SimpleTriggerImpl();
        st.setRepeatInterval(interval);
        st.setRepeatCount(repeatCount);
        st.setMisfireInstruction(misfireInstruction);
        
        return st;
    }
        根据以上分析可以看出获取Trigger对象,需要通过TriggerBuilder类调用相应的类方法创建TriggerBuilder对象,然后通过TriggerBuilder对象的实例方法绑定信息,启动设置,以及调度设置,最后调用实例方法build进行封装Trigger对象的创建过程从而实现创建Trigger对象。
Quartz 学习笔记(一)任务调度框架 | 核心组件 Job、Trigger 和 Scheduler | 入门案例 | 监听器 Quartz 是开源且具有丰富特性的“任务调度库”,能够集成任何的Java应用,小到独立的应用,大到电子商业系统。Quartz既能创建简单,也能创建复杂的任务调度,以执行上十、上百,甚至上万的任务。任务 job 被定义为标准的Java组件,能够执行任何想要实现的功能。... 阅读详情

相关推荐

新手避坑指南:在MacBook上为PyTorch正确配置MPS环境,跑通第一个YOLOv8训练

本文详细指导新手如何在MacBook上为PyTorch正确配置MPS环境,并成功运行YOLOv8训练。从环境准备、PyTorch安装到YOLOv8配置和性能调优,提供全面的避坑指南和实用技巧,帮助开发者充分利用Mac的GPU加速能力。

weixin_29100399的博客 229

Quartz学习总结之核心接口Trigger

参考地址:https://www.cnblogs.com/mengrennwpu/p/7142124.html Trigger负责设置调度策略。该类是一个接口,描述触发 job 执行的时间触发规则。主要有 SimpleTrigger 和 CronTrigger 这两个子类。当且仅当需调度一次或者以固定时间间隔周期执行调度,SimpleTrigger 是最适合的选择;而 CronTr...

zengdongwen的博客 1245

adas硬件_ADAS智能辅助驾驶系统硬件在环(HIL)测试之硬件介绍

这篇主要分享的是ADAS融合系统的HIL测试系统的硬件结构及其作用,其主要包括上位机、机柜、雷达模拟器系统、雷达暗箱系统以及视频暗箱。 上位机 上位机主要运行HIL测试系统的相关软件,测试人员所有的前期准备工作与测试操作均在上面进行,并监控测试结果,其通过网口实现与NI实时机的通信,上位机将VeriStand项目工程下载至NI实时机运行。机柜 机柜主要由可编程电源...

weixin_39580748的博客 2243

quartz教程-触发器Trigger

quart教程-触发器

quxiuchengdev的专栏 2万+

Mamba-YOLO实战:环境配置+模型训练+精度调优全流程指南(附Colab代码)

在目标检测领域,一场由状态空间模型引发的技术革新正在悄然改写行业格局。近期国际顶级学术期刊连续发布的YOLOv5_mamba、FER-YOLO等突破性成果,不仅刷新了检测精度记录,更开创了结构化状态空间模型(SSM)与经典检测框架的创新融合范式。当前该领域涌现的十大标杆性研究,已在以下维度取得突破性进展:√ 遮挡目标识别准确率提升38%√ 小样本场景泛化能力增强2.7倍√ 视频流检测延迟降低至17ms√ 多目标交叉干扰抑制效果达SOTA。

2501_90555291的博客 1583

DeepSeek+知网研学:三步搞定文献矩阵与对比分析(实战指南)

本文提供了一套高效实用的文献管理分析实战指南,详细介绍了如何结合DeepSeek大模型与知网研学平台,通过三个核心步骤快速完成文献梳理。该方法能自动提炼文献核心要素、生成结构化对比矩阵,并辅助发现研究空白,显著提升学术研究者的文献分析效率与深度。

weixin_29061509的博客 491

【数据采集】使用USB口作为trigger的发送接口

最近做研究需要从电脑引出一个trigger信号,但是从主板上引脚引出不太现实,所以考虑从USB口引出,记录一下。 USB口的引脚如下图所示, 由于USB的两个根数据线D+\D-使用的是差分信号表示01,更详细地说,对于USB2.0,D+比D-大200mV时为1,D-比D+大200mV时为0。因此USB电平不适合作为trigger。 考虑到TTL电平为单纯的高低电平信号,+5V等价于逻辑“...

aiyimo_的博客 1779

昇腾Atlas Duo 300I推理卡实战:从零部署Qwen大模型推理服务

本文详细记录了在华为昇腾Atlas Duo 300I推理卡上,从零部署Qwen1.5-14B-Chat大模型推理服务的完整实战过程。涵盖环境准备、MindIE容器配置、CANN工具链安装、服务启动与API测试等关键步骤,并分享了性能观察与排错经验,为国产AI算力平台部署LLM推理服务提供了实用指南。

weixin_29084231的博客 1243

Trigger相关组件

Trigger相关的组件,包含SimpleTrigger于CronTrigger的简介以解Cron表达式的讲解

benben_521ben的博客 809

揭秘大厂 Unity 红点系统设计:别小看右上角那颗小红点,它能把你项目搞崩

本文详细探讨了游戏大厂如何设计高性能红点系统。红点作为提升用户活跃和转化率的重要工具,需要支持多级联动、动态判断和全局一致性。系统采用观察者模式和树形结构,分为数据管理、逻辑判定、订阅通知和UI展示四大模块,通过事件驱动方式实现高效刷新。文章特别强调了解耦设计、配置化管理和性能优化,并提出了热更新、数据分析等高级应用场景。最终指出,优秀的红点系统需要架构标准化、自动化配置和团队紧密协作,是大型游戏项目的关键技术基础。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 378

2026实测可用!4个专业AI Agent Skills垂直搜索平台对比

📊本文以表格形式整理4个实测可用的专业AI Agent Skills垂直搜索平台,涵盖资源规模、适配生态等关键维度🤖,适合开发者按需选择技能获取渠道,解决平台筛选与访问难题✨

XiaoqiangClub的博客 525

触发器-trigger

这两张是逻辑表也是虚表。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。当在定义有触发器的表上执行UPDATE语句时,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。当它检测到指定列已经更新时,触发器就会进一步执行适当的动作,例如发出错误信息指出该列不能更新,或者根据新的更新的列值执行一系列的动作语句。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。

wys0127的博客 2536

【Bluetooth|蓝牙开发】二、蓝牙开发入门

蓝牙,是一种利用低功率无线电,支持设备短距离通信的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换,蓝牙工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段,使用IEEE802.11协议。

Donge's Blog 1万+

Quartz-Trigger详解

文章目录概述触发器接口基本...

别抢我蓝buff 4749

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Quartz】深入Job、JobDetail、JobDataMap、Trigger

Quartz API核心接口有: Scheduler – 与scheduler交互的主要API; Job – 你通过scheduler执行任务,你的任务类需要实现的接口; JobDetail – 定义Job的实例; Trigger – 触发Job的执行; JobBuilder – 定义和创建JobDetail实例的接口; TriggerBuilder – 定义和创建Trigger实例的接口;

Evankaka的专栏 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Quartz之Trigger

先介绍一下Trigger的常用属性: jobKey 标记了Trigger被触发的时候应该被调用的Job的id。startTime 表示了Trigger的调度第一次应该生效的时间。值是一个java.util.Date对象。 endTime  表示了Trigger的调度不再生效的事件。priority 表示了Trigger的触发优先级,当资源不够用的时候有个原则是:事件考前的Trig

键圣的博客 3396

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Quartz - Trigger & RAMJobStore

任务调度 多线程 线程池 Quartz

weixin_44612246的博客 936

定时任务之Quartz

Quartz 的设计核心在于将“做什么(Job)”与“何时做(Trigger)”解耦,并通过“调度器(Scheduler)”进行管理。注意:使用数据库模式前,需确保数据库中已存在 Quartz 所需的 11 张表(如。如果不配置任何 Quartz 属性,Spring Boot 默认使用内存存储。在实际生产中,往往需要通过接口动态添加、修改或删除任务。starter,极大地简化了配置过程。场景 A:内存模式(默认,无需额外配置)Spring Boot 提供了。场景 B:数据库持久化与集群模式。

Listen·Rain的博客 1566

Quartz如何获取当前执行的Trigger如何注册多个Trigger到Job中,如何自定义的 Trigger 类

/ 在这里实现获取下一次触发时间的逻辑 return null;// 在这里实现获取上一次触发时间的逻辑 return null;// 在这里实现设置下一次触发时间的逻辑 } @Override public void setPreviousFireTime(Date date) {

咖啡程序员 784

浅谈Quartz的Trigger

一 点睛 1 Trigger是什么? Quartz中的Trigger用来告诉调度程序什么时候触发。即Trigger对象是用来触发Job的。 2 Quartz框架中的Tirgger 3 触发器通用属性 JobKey:表示job实例的标识,触发器被触发时,该指定的job实例会执行。 StartTime:表示触发器的时间表首次触发的时间。它的值类型是Java.util.Date。 En...

实践求真知 1204

Quartz一个Job绑定多个Trigger

Code 1: JobDetail jobDetail = new JobDetail(jobName, jobGroup, class1.getClass()); // durable, 指明任务就算没有绑定Trigger仍保留在Quartz的JobStore中, jobDet...

chixulu6723的博客 4635

java trigger_Quartz教程四:Trigger

本系列教程由quartz-2.2.x官方文档翻译、整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处,欢迎指正;有兴趣研究源码的同学,可以参考我对quartz-core源码的注释(进行中)。与job一样,trigger也很容易使用,但是还有一些扩展选项需要理解,以便更好地使用quartz。trigger也有很多类型,可以根据实际需要来选择。Trigger的公共属性所...

weixin_36318548的博客 1210
上一篇: 2018春招链家笔试编程题题解
下一篇: 初识Quartz之Scheduler组件
carson0408
博客等级 码龄9年 238粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值