java - 具有相同触发器的相同 cron 作业在多个工作线程中运行
问题描述
我看到这个问题,在基于定义的 cron 运行作业时,具有相同作业键和相同作业触发器的同一个作业被多次触发。
Quartz 定义为 ThreadPool 大小为 3,每当作业运行时,quartz 都会使用这 3 个线程并运行作业几乎 38 次(每次石英运行作业时这个数字都是动态的)。
春季启动:2.5.3 石英调度器:2.3.2
cron 表达式:
Given the Quartz cron '* */3 * * * ? (every 3 minutes)' and reference date '2021-08-08T13:03:22.541936-04:00[America/New_York]'
每 3 分钟运行一次作业时的作业执行输出:
=============== executing cron job =====================
Job Key: email-jobs.email-cron-job
Job Trigger Key: email-triggers.email-cron-job
Scheduler Name: service_ml_scheduler
Scheduler Id: nsimha-mac-11628442202262
Fire Instance Id: nsimha-mac-116284422022621628442202250
Thread Id: service_ml_scheduler_Worker-1
========================================================
=============== executing cron job =====================
Job Key : email-jobs.email-cron-job
Job Trigger Key: email-triggers.email-cron-job
Scheduler Name: service_ml_scheduler
Scheduler Id: nsimha-mac-11628442202262
Fire Instance Id: nsimha-mac-116284422022621628442202251
Thread Id: service_ml_scheduler_Worker-2
========================================================
=============== executing cron job =====================
Job Key: email-jobs.email-cron-job
Job Trigger Key: email-triggers.email-cron-job
Scheduler Name: service_ml_scheduler
Scheduler Id: nsimha-mac-11628442202262
Fire Instance Id: nsimha-mac-116284422022621628442202252
Thread Id: service_ml_scheduler_Worker-3
========================================================
=============== executing cron job =====================
Job Key: email-jobs.email-cron-job
Job Trigger Key: email-triggers.email-cron-job
Scheduler Name: service_ml_scheduler
Scheduler Id: nsimha-mac-11628442202262
Fire Instance Id: nsimha-mac-116284422022621628442202253
Thread Id: service_ml_scheduler_Worker-1
========================================================
=============== executing cron job =====================
Job Key: email-jobs.email-cron-job
Job Trigger Key: email-triggers.email-cron-job
Scheduler Name: service_ml_scheduler
Scheduler Id: nsimha-mac-11628442202262
Fire Instance Id: nsimha-mac-116284422022621628442202254
Thread Id: service_ml_scheduler_Worker-2
========================================================
=============== executing cron job =====================
Job Key: email-jobs.email-cron-job
Job Trigger Key: email-triggers.email-cron-job
Scheduler Name: service_ml_scheduler
Scheduler Id: nsimha-mac-11628442202262
Fire Instance Id: nsimha-mac-116284422022621628442202255
Thread Id: service_ml_scheduler_Worker-3
========================================================
mysql> select * from QRTZ_TRIGGERS;
+----------------------+----------------+----------------+----------------+------------+--------------------+----------------+----------------+----------+---------------+--------------+---------------+----------+---------------+---------------+--------------------+
| SCHED_NAME | TRIGGER_NAME | TRIGGER_GROUP | JOB_NAME | JOB_GROUP | DESCRIPTION | NEXT_FIRE_TIME | PREV_FIRE_TIME | PRIORITY | TRIGGER_STATE | TRIGGER_TYPE | START_TIME | END_TIME | CALENDAR_NAME | MISFIRE_INSTR | JOB_DATA |
+----------------------+----------------+----------------+----------------+------------+--------------------+----------------+----------------+----------+---------------+--------------+---------------+----------+---------------+---------------+--------------------+
| service_ml_scheduler | email-cron-job | email-triggers | email-cron-job | email-jobs | Send Email Trigger | 1628443488000 | 1628443487000 | 5 | ACQUIRED | CRON | 1628443286000 | 0 | NULL | 0 | NULL |
+----------------------+----------------+----------------+----------------+------------+--------------------+----------------+----------------+----------+---------------+--------------+---------------+----------+---------------+---------------+--------------------+
1 row in set (0.00 sec)
mysql> select * from QRTZ_CRON_TRIGGERS;
+----------------------+----------------+----------------+-----------------+------------------+
| SCHED_NAME | TRIGGER_NAME | TRIGGER_GROUP | CRON_EXPRESSION | TIME_ZONE_ID |
+----------------------+----------------+----------------+-----------------+------------------+
| service_ml_scheduler | email-cron-job | email-triggers | * */3 * * * ? | America/New_York |
+----------------------+----------------+----------------+-----------------+------------------+
1 row in set (0.00 sec)
mysql> select SCHED_NAME, JOB_NAME, JOB_GROUP, DESCRIPTION, JOB_CLASS_NAME, IS_DURABLE, IS_NONCONCURRENT, IS_UPDATE_DATA, REQUESTS_RECOVERY from QRTZ_JOB_DETAILS;
+----------------------+----------------+------------+----------------+------------------------------------------+------------+------------------+----------------+-------------------+
| SCHED_NAME | JOB_NAME | JOB_GROUP | DESCRIPTION | JOB_CLASS_NAME | IS_DURABLE | IS_NONCONCURRENT | IS_UPDATE_DATA | REQUESTS_RECOVERY |
+----------------------+----------------+------------+----------------+------------------------------------------+------------+------------------+----------------+-------------------+
| service_ml_scheduler | email-cron-job | email-jobs | Send Email Job | com.example.springquartz.crons.SampleJob | 1 | 1 | 0 | 0 |
+----------------------+----------------+------------+----------------+------------------------------------------+------------+------------------+----------------+-------------------+
1 row in set (0.00 sec)
private static JobDetail buildJobDetail() {
return JobBuilder.newJob(SampleJob.class)
.withIdentity("email-cron-job", "email-jobs")
.withDescription("Send Email Job")
.usingJobData(new JobDataMap())
.storeDurably()
.build();
}
private static Trigger buildJobTrigger(JobDetail jobDetail, ZonedDateTime startAt) {
return TriggerBuilder.newTrigger()
.forJob(jobDetail)
.withIdentity(jobDetail.getKey().getName(), "email-triggers")
.withDescription("Send Email Trigger")
.startAt(Date.from(startAt.toInstant()))
.withSchedule(CronScheduleBuilder.cronSchedule("* */3 * * * ?")
.withMisfireHandlingInstructionIgnoreMisfires())
.build();
}
@DisallowConcurrentExecution
public class SampleJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
String jobKey = context.getJobDetail().getKey().toString();
String jobTrigger = context.getTrigger().getKey().toString();
String schedulerName = "";
String schedulerId = "";
try {
schedulerName = context.getScheduler().getSchedulerName();
schedulerId = context.getScheduler().getSchedulerInstanceId();
} catch (SchedulerException e) {
e.printStackTrace();
}
System.out.println("=============== executing cron job =====================");
System.out.println("Job Key: " + jobKey);
System.out.println("Job Trigger Key : " + jobTrigger);
System.out.println("Scheduler Name: " + schedulerName);
System.out.println("Scheduler Id: " + schedulerId);
System.out.println("Fire Instance Id: " + context.getFireInstanceId());
System.out.println("Thread Id: " + Thread.currentThread().getName());
System.out.println("========================================================");
//System.out.println("this is inside the job execution " + Thread.currentThread().getName());
}
}
示例应用程序可以在https://github.com/quartz-scheduler/quartz/files/6954758/SpringQuartz.tar.gz找到
解决方案
推荐阅读
- powerbi - 将 Power BI 报表生成器连接到 postgresql
- jquery - 多个选择框,使用jquery获取选定的值
- arcore - ArCore:获取通常面向平面但沿相机方向旋转的对象的姿势
- assembly - 调试迭代斐波那契(手动从 C 转换为 RISC-V)
- python - 如何在列表中找到所有连接的子列表?Python
- docker - 从我的 docker 站点的 URL 中删除端口号
- react-native - 可重用代码中的问题以检查本机反应中的互联网可用性
- javascript - 如何找到具有相同href 的-tags,以便可以将类添加到具有相同-tag 的所有元素?
- node.js - heroku:package.json 中未指定节点版本
- mysql - 安装 MySQL 后无法通过 SSH 连接到 Google Cloud VM