对于重复的cron表达式,触发器仅触发一次

时间:2019-07-19 18:30:53

标签: quartz-scheduler quartz

当我尝试以每分钟一分钟的相同cron表达式(0 * * * *?)计划两个不同的作业时,仅触发一个触发器。我几乎尝试了一切,但没有任何效果。我还传递了参数spring.quartz.properties.org.quartz.scheduler.batchTriggerAcquisitionMaxCount=10,但没有成功。一分钟内至少触发一次,有时一分钟触发两次,但一分钟内不会连续触发两个触发。我做错什么了吗?

编辑:我在db上检查了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();
    }

1 个答案:

答案 0 :(得分:0)

有趣但真实。我认为这是我第三次成为Eclipse的受害者。尽管我看不到任何在eclipse上运行的实例,但我的石英应用程序始终有一个运行不时的实例,我偶然在Task Manager上看到了它。但是我什至调试了石英源代码:)

因此,如果您遇到我遇到的相同问题,首先请确保没有在任何地方运行您的应用程序的任何其他实例,这也可能是另一个正在使用您的石英数据库的石英应用程序。当我开始怀疑是否还有其他正在运行的实例时,我看到触发器NEXT_FIRE_TIME正在更新,因为它必须进行更新,但是我没有看到触发器监听器发生任何火灾。

希望这些可以帮助您识别问题。