Java实现多Cron定时任务调度

publicclassMultiCronMain{publicstaticvoidmain(String[]args)throwsSchedulerException{// 2. 调度多个 cron 表达式Schedulerscheduler=StdSchedulerFactory.getDefaultScheduler();scheduler.start();// 创建 JobDetail(只创建一次)JobDetailjob=JobBuilder.newJob(MyJob.class).withIdentity("myJob","group1").build();// 多个 cron 表达式String[]cronExpressions={// 20秒执行一次"0/20 * * * * ?","0/2 55 19 * * ?",};inti=1;Set<Trigger>triggersForJob=newHashSet<>();for(Stringcron:cronExpressions){Triggertrigger=TriggerBuilder.newTrigger().withIdentity("trigger-"+i++,"group1").withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();triggersForJob.add(trigger);}// 注意:job 是同一个!scheduler.scheduleJob(job,triggersForJob,true);}}

你这段代码是使用Quartz Scheduler实现同一个 Job 被多个 Cron 表达式触发的标准做法。下面逐行解析其含义和关键点:


✅ 整体目标

MyJob这个任务,按照两个不同的 cron 规则执行:

  1. 每 20 秒执行一次(0/20 * * * * ?
  2. 每天 19:55 开始,每 2 秒执行一次(0/2 55 19 * * ?

🔍 代码逐段解析

1. 创建调度器并启动
Schedulerscheduler=StdSchedulerFactory.getDefaultScheduler();scheduler.start();
  • 获取默认的 Quartz 调度器实例;
  • 启动调度器(开始监听触发事件)。

2. 定义 JobDetail(任务模板)
JobDetailjob=JobBuilder.newJob(MyJob.class).withIdentity("myJob","group1").build();
  • MyJob.class:你实现的Job接口类;
  • .withIdentity("myJob", "group1"):给这个任务起个唯一标识(名称 + 组名);
  • 注意:这里只创建一个JobDetail,代表“任务本身”,不包含调度时间。

📌JobDetail是任务的“蓝图”,可以被多个 Trigger 引用。


3. 定义多个 cron 表达式
String[]cronExpressions={"0/20 * * * * ?",// 每20秒一次(全天)"0/2 55 19 * * ?",// 每天19:55:00、19:55:02...19:55:58};
  • 两个合法的Quartz cron 表达式(6位,含秒,结尾用?)。

4. 为每个 cron 创建 Trigger 并收集到 Set 中
Set<Trigger>triggersForJob=newHashSet<>();for(Stringcron:cronExpressions){Triggertrigger=TriggerBuilder.newTrigger().withIdentity("trigger-"+i++,"group1").withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();triggersForJob.add(trigger);}
  • 每个 cron 表达式生成一个独立的CronTrigger
  • 每个 Trigger 有唯一 ID(如trigger-1,trigger-2);
  • 所有 Trigger 放入一个Set集合。

✅ 这是关键:多个 Trigger → 同一个 Job


5. 一次性将 Job 和多个 Trigger 关联
scheduler.scheduleJob(job,triggersForJob,true);
  • 这是Quartz 提供的批量调度方法
    voidscheduleJob(JobDetailjobDetail,Set<?extendsTrigger>triggersForJob,booleanreplace)
  • job:任务模板;
  • triggersForJob:所有要绑定的触发器;
  • true:如果已存在同名 Job,是否替换(replace = true)。

效果:Quartz 内部会将这个JobDetail与多个Trigger建立关联。
每当任意一个 Trigger 触发,就会执行MyJob.execute()方法。


⚠️ 重要注意事项

1.Job 必须是无状态的(或线程安全)
  • 因为两个 Trigger 可能同时触发(比如在 19:55:00 时,第一个 cron 也可能刚好到 20 秒整点);
  • 如果MyJob有共享变量或非线程安全操作,需加锁或使用@DisallowConcurrentExecution注解:
@DisallowConcurrentExecutionpublicclassMyJobimplementsJob{publicvoidexecute(JobExecutionContextcontext){...}}
2.Trigger 的命名必须唯一
  • 你在循环中用i++确保了trigger-1,trigger-2不重复,这是正确的。
3.表达式格式是 Quartz 特有的
  • 0/20 * * * * ?:每 20 秒(秒字段)
  • 0/2 55 19 * * ?:19:55 分,每 2 秒
  • 结尾的?表示“不指定星期几”(Quartz 要求“日”和“周”互斥)

✅ 执行效果示例

假设当前时间是19:55:00

  • Trigger 1:如果当前秒是 0、20、40,则触发;
  • Trigger 2:在 19:55:00、19:55:02、19:55:04 …… 19:55:58 触发;

所以19:55:00、19:55:20、19:55:40这三个时刻,两个 Trigger 会同时触发,导致MyJob被并发执行两次(除非你加了@DisallowConcurrentExecution)。


💡 总结:这段代码的核心思想

“一个任务逻辑(Job),多个调度规则(Trigger)”
通过 Quartz 的scheduleJob(JobDetail, Set<Trigger>, ...)方法,
实现复用同一个 Job 类,按不同时间策略执行,避免代码重复。

这是 Quartz 中最佳实践,完全符合其设计哲学。

✅ 你的代码写法正确且高效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1184907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.19。

今日收获&#xff1a;1.单词1002.算法1题——回溯今天学的少打算明天过完jvm调优和双亲委派

工业级边缘计算网关的热设计与可靠性保障:以ARM架构为例

摘要&#xff1a; 在工业物联网&#xff08;IIoT&#xff09;场景中&#xff0c;储能柜等封闭空间对网关的耐温性提出了严苛要求。本文将剥离商业营销&#xff0c;从纯技术维度探讨基于ARM架构的工业级边缘计算网关的热设计挑战。重点分析无风扇散热结构、宽温级晶振/电容的选型…

Notation 英文单词学习

1️、基本信息单词&#xff1a;notation词性&#xff1a;名词发音&#xff1a; &#x1f1fa;&#x1f1f8; /noʊˈteɪ.ʃən/&#x1f1ec;&#x1f1e7; /nəʊˈteɪ.ʃən/词源&#xff1a; 来自拉丁语 notatio&#xff08;标记、符号&#xff09; → notation 符号 / 标…

CPU 中的算术逻辑单元(ALU)的 状态标志

CPU 中的算术逻辑单元&#xff08;ALU&#xff09;的 状态标志 理解ALU状态标志不仅是理解CPU如何工作的核心&#xff0c;也是掌握汇编语言编程和计算机底层逻辑的关键。 本文将从概念、每个标志的解析、到实际应用和架构差异&#xff0c;层层递进。核心概念回顾 状态标志是CPU…

POF|西工大廖晖、刘溢浪等:数据驱动的湍流建模:基于符号回归与数据同化的双向耦合框架

Data-Driven Turbulence Modeling: A Mutually Coupled Framework for Symbolic Regression and Data Assimilation 数据驱动的湍流建模&#xff1a;基于符号回归与数据同化的双向耦合框架 廖晖&#xff0c;孙旭翔, 刘溢浪*, 张伟伟 西北工业大学 航空学院&#xff0c; 西安…

流量困局下的破局之道:“推三返一”模式开启私域增长新引擎

在当下流量成本不断攀升、用户增长愈发艰难的商业大环境中&#xff0c;企业面临着巨大的经营压力&#xff0c;如何在低成本的前提下实现高转化&#xff0c;成为了众多企业亟待解决的关键问题。“推三返一”模式凭借其独特的“消费即投资、分享即收益”裂变逻辑&#xff0c;正逐…

外文文献检索网站使用指南与资源获取方法

做科研的第一道坎&#xff0c;往往不是做实验&#xff0c;也不是写论文&#xff0c;而是——找文献。 很多新手科研小白会陷入一个怪圈&#xff1a;在知网、Google Scholar 上不断换关键词&#xff0c;结果要么信息过载&#xff0c;要么完全抓不到重点。今天分享几个长期使用的…

C++(C++17/20)最佳工厂写法和SLAM应用综合示例

现代 C&#xff08;C17/20&#xff09;下的最佳工厂写法一、现代 C 工厂设计的基本原则 在 C17/20 下&#xff0c;好的工厂写法通常满足&#xff1a;RAII 明确所有权 返回 std::unique_ptr<T> 为默认无 switch / 无 RTTI支持扩展而不修改&#xff08;OCP&#xff09;构造…

如何高效使用论文搜索网站获取学术资源

做科研的第一道坎&#xff0c;往往不是做实验&#xff0c;也不是写论文&#xff0c;而是——找文献。 很多新手科研小白会陷入一个怪圈&#xff1a;在知网、Google Scholar 上不断换关键词&#xff0c;结果要么信息过载&#xff0c;要么完全抓不到重点。今天分享几个长期使用的…

POF|清华大学张宇飞团队:采用数据驱动湍流模型的三维增升装置模拟

采用数据驱动湍流模型的三维增升装置模拟 Three-dimensional high-lift configuration simulation usingdata-driven turbulence model 张绍广&#xff0c;吴辰禹&#xff0c;张宇飞* 清华大学&#xff0c;航天航空学院&#xff0c;北京100084 引用格式&#xff1a; Liao H,…

配电不透明,管理就无从谈起,这正是很多企业大楼的现状

安科瑞刘鸿鹏172 一 ⑥⑨⑦② 一 5322在企业大楼的配电系统中&#xff0c;用电规模不断扩大、负载类型日趋复杂&#xff0c;传统断路器“只分合、不感知”的局限性正逐渐显现。运维人员往往只能在故障发生后被动处理&#xff0c;缺乏对回路运行状态的持续掌握&#xff0c;这不仅…

❿⁄₁₄ ⟦ OSCP ⬖ 研记 ⟧ 密码攻击实践 ➱ 传递Net-NTLMv2哈希

郑重声明&#xff1a;本文所涉安全技术仅限用于合法研究与学习目的&#xff0c;严禁任何形式的非法利用。因不当使用所导致的一切法律与经济责任&#xff0c;本人概不负责。任何形式的转载均须明确标注原文出处&#xff0c;且不得用于商业目的。 &#x1f50b; 点赞 | 能量注入…

UL 认证光伏电表如何满足北美逆变器并网要求?

安科瑞刘鸿鹏在北美光伏市场中&#xff0c;无论是分布式屋顶光伏&#xff0c;还是工商业逆变器并网项目&#xff0c;对电能计量与并网监测的要求始终处在一个较高标准。并网合规、发电量核算、能量流向判定以及与逆变器系统的稳定通信&#xff0c;都是光伏系统能否顺利运行的基…

企业级光储充电站能量协调控制系统的设计与应用

安科瑞刘鸿鹏 摘要随着企业级光伏、储能及电动汽车充电设施的集中建设&#xff0c;光储充电站逐渐从单一能源设施演变为具备多源接入、多目标运行的复杂用能系统。如何在保障安全运行的前提下&#xff0c;实现新能源有效消纳、储能经济调度及充电负荷柔性管理&#xff0c;成为企…

2026版Java面试题库及答案解析

今年的行情&#xff0c;让招聘面试变得雪上加霜。已经有不少大厂&#xff0c;如腾讯、字节跳动的招聘名额明显减少&#xff0c;面试门槛却一再拔高&#xff0c;如果不用心准备&#xff0c;很可能就被面试官怼得哑口无言&#xff0c;甚至失去了难得的机会。 现如今&#xff0c;…

MATLAB 神经网络从入门到实战:零基础教程

一、神经网络核心概念与MATLAB优势 神经网络是模拟人脑神经元结构的数学模型,通过数据训练自动学习特征规律,广泛应用于分类、回归、预测等场景。MATLAB作为工程领域主流工具,其Neural Network Toolbox(神经网络工…

Java多线程编程:使用场景与实现详解

Java多线程编程&#xff1a;使用场景与实现详解 一、什么是多线程 多线程是指在一个程序中同时运行多个线程&#xff0c;每个线程可以独立执行不同的任务。Java从语言层面提供了强大的多线程支持&#xff0c;使得并发编程变得相对简单。 二、常见使用场景 1. 提高程序响应速度 …

疆鸿智能ETHERCAT从站转DEVICENET主站详细解读,建议点赞收藏术语

疆鸿智能ETHERCAT从站转DEVICENET主站详细解读&#xff0c;建议点赞收藏 术语 DeviceNet&#xff1a;DeviceNet是ODVA推出基于CAN的一种通讯规范 EtherCAT&#xff1a;EtherCAT&#xff08;以太网控制自动化技术&#xff09;是一个开放架构&#xff0c;以以太网为基础的现场…

读懂价格背后的语言:如何用速卖通价格历史图表,预判市场趋势与库存风险

当你在速卖通上看到一款常销产品的价格突然下跌&#xff0c;一个紧迫的问题随之而来&#xff1a;这是供应商为清仓或冲量进行的短期促销&#xff0c;还是预示市场饱和、竞争加剧的长期降价趋势&#xff1f;判断失误的代价是高昂的——若误将趋势当促销而大量补货&#xff0c;可…

免费查文献的网站推荐:实用且可靠的文献查询平台汇总

做科研的第一道坎&#xff0c;往往不是做实验&#xff0c;也不是写论文&#xff0c;而是——找文献。 很多新手科研小白会陷入一个怪圈&#xff1a;在知网、Google Scholar 上不断换关键词&#xff0c;结果要么信息过载&#xff0c;要么完全抓不到重点。今天分享几个长期使用的…