Когда я пытаюсь запланировать два разных задания с одним и тем же выражением 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, всегда был устаревший запущенный экземпляр моего кварцевого приложения, которое я случайно увидел в диспетчере задач. Однако я даже отлаживал исходный код кварца :)
Так что, если вы столкнулись с той же проблемой, что и я, прежде всего убедитесь, что нигде не запущено никакого другого экземпляра вашего приложения, это также может быть другое приложение кварца, которое может использовать ваш кварц db. Когда я начинаю подозревать, есть ли какой-либо другой запущенный экземпляр, это был момент, когда я увидел, что триггер NEXT_FIRE_TIME обновляется, как и должно быть, но я не видел никакого срабатывания на моем прослушивателе триггеров.
Надеюсь, это поможет вам определить ваши проблемы.