news 2026/6/9 20:46:58

Java实现多Cron定时任务调度

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 中最佳实践,完全符合其设计哲学。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:12:59

突破C2Q瓶颈,MLGO微算法科技高性能可重构计算机实现量子算法真实级仿真,推动量子仿真进入新阶段

在量子计算技术快速发展的当下&#xff0c;如何以现实可行的方式进行量子算法的验证与评估&#xff0c;成为产业界与科研界共同面临的重要挑战。量子硬件虽然已进入噪声中型量子&#xff08;NISQ&#xff09;阶段&#xff0c;但其量子比特数量、纠缠深度和抗噪性能依然受到严苛…

作者头像 李华
网站建设 2026/6/10 11:12:36

python鲜花销售系统 网上鲜花商城系统商家

目录鲜花销售系统摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;鲜花销售系统摘要 网上鲜花商城系统为商家提供高效便捷的线上销售平台&#xff0c;整合订单管理、库存跟踪、客户服务等…

作者头像 李华
网站建设 2026/6/10 10:23:40

基于python+Vue的游戏装备交易商城系统

目录系统概述技术架构核心功能创新与优化应用价值开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 该系统基于Python后端与Vue.js前端构建&#xff0c;专为游戏装备交易设计&#x…

作者头像 李华
网站建设 2026/6/9 20:52:44

广西产业带背后的真实情况:不要再把“东盟展厅”当成是源头工厂了!

作为中国和东盟合作的前沿地带&#xff0c;广西壮族自治区正在全力打造具有特色的产业集群&#xff1a;南宁的电子信息产业、柳州的新能源汽车产业、玉林的香料陶瓷产业、钦州的燕窝荔枝产业、崇左的东盟水果产业等等……政策带来的发展红利和优越的地理位置优势相互叠加&#…

作者头像 李华
网站建设 2026/6/10 11:45:42

网站一级域名和二级域名区别有哪些?一定要区分清楚

一、什么是一级域名&#xff1f; 一级域名&#xff0c;通常由后缀和核心主体组成。核心主体是企业、组织或个人注册的唯一标识&#xff0c;后缀则分为通用顶级域名&#xff08;如.com、.org、.net&#xff09;、国家/地区顶级域名&#xff08;如.cn、.uk、.jp&#xff09;两类。…

作者头像 李华
网站建设 2026/6/10 11:27:38

SSM学生信息管理系统63yq0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面

系统程序文件列表系统项目功能&#xff1a;学生,教师,教室信息,课程信息,奖惩登记,学生选课,教学反馈,课程分类,课程成绩,心理报告,体检报告,学生成绩,学生申请教室,教师申请教室,学生请假,社团申请SSM学生信息管理系统开题报告一、课题研究背景与意义&#xff08;一&#xff0…

作者头像 李华