java - Quartz 调度程序在集群模式下的所有节点上触发 cron 作业
问题描述
我有一个使用 Quartz 作为作业调度程序的应用程序。有两种情况
- 安排将来执行的作业。
- 每 10 秒运行一次的 cron 作业。
我运行我的应用程序的两个实例。两者都设置为集群模式,并且都将 instanceId 设置为“AUTO”。
这些是我的观察:
应用程序的两个实例都启动并连接到数据库。两者都报告它们已成功集群并连接到数据库。
当我根据场景 1 安排作业时,在作业执行时只有一个应用程序执行作业。
场景 2,即每 10 秒执行一次的 cron 作业,正在由两个应用程序同时执行。
我查看了数据库中的 qrtz 表。cron 作业只有一个作业和一个触发器。
我还在 qrtz db“计划状态”表中观察到应用程序的两个实例都在持续签入。
这是我设置 cron 作业的方法:
val myCronJob = newJob(MyCronJob::class.java)
.withIdentity("cronjob", "cronJobGroup")
.build()
val trigger = newTrigger()
.withIdentity("cronjob", "cronJobGroup")
.startNow()
.withSchedule(simpleSchedule()
.withMisfireHandlingInstructionIgnoreMisfires()
.withIntervalInSeconds(10)
.repeatForever())
.build()
任何帮助或指导将不胜感激!
解决方案
我认为您可以在您的作业类上使用 @DisallowConcurrentExecution 注释。
来自文档:将 Job 类标记为不能同时执行多个 * 实例的注释(其中实例基于 JobDetail * 定义 - 或换句话说基于 JobKey)。
推荐阅读
- c# - 如何将由 [ 和 ] 分隔的字符串转换为 C# 中的数组
- javascript - Playwright 无法评估返回的定义变量
- python - 如何从 MoviePy 中的视频中删除某些时间
- javascript - 两个圆之间的交点检测不起作用
- css - 如何在 Angular 材料中分离同一 html 中的组件?
- php - 通过终端更新作曲家时如何解决这个问题
- python-3.x - 为什么我不能使用 .bind 以与 tkinter 按钮列表中的命令标志相同的方式绑定函数
- kotlin - 如何更新变量以更改其值?(科特林)
- javascript - 如何将要添加到 React Native Context 状态的项目排队
- sql - oracle sql中的合并查询