Quartz 触发的处于 ERROR 状态的作业不再调用execute

问题描述 投票:0回答:1

我们注意到一些触发的作业不时进入错误状态。 在这种状态下

execute
不再被调用! quartz 上有什么配置可以控制这种行为吗?我希望它继续重试/触发作业

我们仍然不确定最初导致 ERROR 状态的原因。 这篇文章似乎暗示这是因为分配给该作业的 Pod 丢失/删除/等等;但是我不认为触发器是这样工作的,这似乎与调度作业更相关。为了排除故障,我们实现了触发侦听器:

public class QuartzJobListener implements TriggerListener {
    private static final Logger LOGGER = LoggerFactory.getLogger(QuartzJobListener.class);

    @Override
    public void triggerFired(Trigger trigger, JobExecutionContext context) {
        LOGGER.info("Job executing via trigger: " + trigger.getJobKey());
    }

    @Override
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
        LOGGER.info("Job execution vetoed: " + trigger.getJobKey());
        return false;
    }

    @Override
    public void triggerMisfired(Trigger trigger) {
        LOGGER.info("Job trigger misfired: " + trigger.getJobKey());
    }

    @Override
    public void triggerComplete(Trigger trigger, JobExecutionContext context, CompletedExecutionInstruction triggerInstructionCode) {
        LOGGER.info("Job trigger completed: " + trigger.getJobKey());
    }

    @Override
    public String getName() {
        return "QuartzJobListener";
    }
}

但是这里没有错误情况,这使得我们更难检测我们最初何时进入 ERROR 状态以及原因。

以下是我们创建触发作业的方法:

@Bean
    @ConditionalOnProperty(prefix = "tickets.background.job", name = "deliver-tickets.enabled", havingValue = "true")
    JobDescription deliverTicketsJobDescription() {
        final long now = metrics ? System.currentTimeMillis() : 0;
        JobDescription jobDescription =  JobDescriptionBuilder.builder()
                .triggerType(TriggerType.CRON)
                .jobClass(DeliverTicketsJob.class)
                .cronExpression(deliverTicketsCron)
                .jobGroupId(jobGroupId)
                .jobId("deliverTickets")
                .build();
        if (metrics) {
            LOGGER.debug("METRIC: deliverTicketsJobDescription ~ duration: " + (System.currentTimeMillis() - now) + "ms");
        }
        return jobDescription;
    }
java quartz-scheduler
1个回答
0
投票

您在作业实施中是否有适当的异常处理?石英期待 你在错误情况下抛出 JobExecutionException 并且该类有标志来控制作业的重试行为,我认为 setRefireImmediately 就是你正在寻找的。

另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.