对于重复的 cron 表达式,触发器只触发一次
trigger is firing only once for duplicate cron expressions
当我尝试用每分钟相同的 cron 表达式 (0 * * * * ?) 安排两个不同的作业时,只有一个触发器被触发。我几乎尝试了一切,但没有任何效果。我也传了参数spring.quartz.properties.org.quartz.scheduler.batchTriggerAcquisitionMaxCount=10
,但是没用。一分钟内至少触发一个触发器,有时触发两个,但绝不会在一分钟内连续触发两个触发器。我做错了什么吗?
编辑:我在数据库上检查了 Next_Fire_Time 正在更新但没有被触发,甚至没有被误触发或被否决,正如我从我的触发器监听器中看到的那样。
public class GlobalTriggerListener implements TriggerListener {
private static final String TRIGGER_LISTENER_NAME = "GlobalTriggerListener";
@Override
public String getName() {
return TRIGGER_LISTENER_NAME;
}
@Override
public void triggerFired(Trigger trigger, JobExecutionContext context) {
String triggerName = context.getJobDetail().getKey().toString();
System.out.println("triggerFired");
System.out.println("trigger : " + triggerName + " is fired");
}
@Override
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
boolean veto = false;
System.out.println("Veto Job Excecution trigger: " + veto);
return veto;
}
@Override
public void triggerMisfired(Trigger trigger) {
System.out.println(getName() + " trigger: " + trigger.getKey() + " misfired at " + trigger.getStartTime());
}
@Override
public void triggerComplete(Trigger trigger, JobExecutionContext context, Trigger.CompletedExecutionInstruction triggerInstructionCode) {
System.out.println(getName() + " trigger: " + trigger.getKey() + " completed at " + trigger.getStartTime());
}
}
private JobDetail buildJobDetail(ScheduledProcess sProcess) {
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put(JOB_DATA_KEY, sProcess.getSpid());
return JobBuilder.newJob(ProcessStarterJob.class)
.withIdentity(UUID.randomUUID().toString(), "scheduled-processes")
.withDescription("Start Process Job")
.usingJobData(jobDataMap)
.storeDurably()
.build();
}
private Trigger buildJobTrigger(JobDetail jobDetail, ScheduledProcess sProcess) throws ParseException {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date startDate = formatter.parse(sProcess.getStartDate());
Date endDate = formatter.parse(sProcess.getEndDate());
return TriggerBuilder.newTrigger()
.withIdentity(jobDetail.getKey().getName(), "scheduled-processes-triggers")
.withDescription("Start Process Trigger")
.startAt(startDate)
.endAt(endDate)
.withSchedule(CronScheduleBuilder.cronSchedule(sProcess.getQuartzDef()).withMisfireHandlingInstructionDoNothing())
.build();
}
有趣但真实。我认为这是我第三次成为 Eclipse 的受害者。虽然我在 eclipse 上看不到任何实例 运行,但我的石英应用程序总是有一个陈旧的 运行 实例,我偶然在任务管理器上看到了它。但是我什至调试了石英源代码:)
因此,如果您遇到与我相同的问题,首先要确保 运行 任何地方都没有您的应用程序的任何其他实例,这也可能是另一个可能正在使用您的应用程序的石英应用程序石英数据库当我开始怀疑是否还有其他 运行 实例时,我看到 Trigger NEXT_FIRE_TIME 正在更新,但我没有看到我的 Trigger Listener 有任何问题.
希望这些可以帮助您找出问题。
当我尝试用每分钟相同的 cron 表达式 (0 * * * * ?) 安排两个不同的作业时,只有一个触发器被触发。我几乎尝试了一切,但没有任何效果。我也传了参数spring.quartz.properties.org.quartz.scheduler.batchTriggerAcquisitionMaxCount=10
,但是没用。一分钟内至少触发一个触发器,有时触发两个,但绝不会在一分钟内连续触发两个触发器。我做错了什么吗?
编辑:我在数据库上检查了 Next_Fire_Time 正在更新但没有被触发,甚至没有被误触发或被否决,正如我从我的触发器监听器中看到的那样。
public class GlobalTriggerListener implements TriggerListener {
private static final String TRIGGER_LISTENER_NAME = "GlobalTriggerListener";
@Override
public String getName() {
return TRIGGER_LISTENER_NAME;
}
@Override
public void triggerFired(Trigger trigger, JobExecutionContext context) {
String triggerName = context.getJobDetail().getKey().toString();
System.out.println("triggerFired");
System.out.println("trigger : " + triggerName + " is fired");
}
@Override
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
boolean veto = false;
System.out.println("Veto Job Excecution trigger: " + veto);
return veto;
}
@Override
public void triggerMisfired(Trigger trigger) {
System.out.println(getName() + " trigger: " + trigger.getKey() + " misfired at " + trigger.getStartTime());
}
@Override
public void triggerComplete(Trigger trigger, JobExecutionContext context, Trigger.CompletedExecutionInstruction triggerInstructionCode) {
System.out.println(getName() + " trigger: " + trigger.getKey() + " completed at " + trigger.getStartTime());
}
}
private JobDetail buildJobDetail(ScheduledProcess sProcess) {
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put(JOB_DATA_KEY, sProcess.getSpid());
return JobBuilder.newJob(ProcessStarterJob.class)
.withIdentity(UUID.randomUUID().toString(), "scheduled-processes")
.withDescription("Start Process Job")
.usingJobData(jobDataMap)
.storeDurably()
.build();
}
private Trigger buildJobTrigger(JobDetail jobDetail, ScheduledProcess sProcess) throws ParseException {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date startDate = formatter.parse(sProcess.getStartDate());
Date endDate = formatter.parse(sProcess.getEndDate());
return TriggerBuilder.newTrigger()
.withIdentity(jobDetail.getKey().getName(), "scheduled-processes-triggers")
.withDescription("Start Process Trigger")
.startAt(startDate)
.endAt(endDate)
.withSchedule(CronScheduleBuilder.cronSchedule(sProcess.getQuartzDef()).withMisfireHandlingInstructionDoNothing())
.build();
}
有趣但真实。我认为这是我第三次成为 Eclipse 的受害者。虽然我在 eclipse 上看不到任何实例 运行,但我的石英应用程序总是有一个陈旧的 运行 实例,我偶然在任务管理器上看到了它。但是我什至调试了石英源代码:)
因此,如果您遇到与我相同的问题,首先要确保 运行 任何地方都没有您的应用程序的任何其他实例,这也可能是另一个可能正在使用您的应用程序的石英应用程序石英数据库当我开始怀疑是否还有其他 运行 实例时,我看到 Trigger NEXT_FIRE_TIME 正在更新,但我没有看到我的 Trigger Listener 有任何问题.
希望这些可以帮助您找出问题。