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;
}
您在作业实施中是否有适当的异常处理?石英期待 你在错误情况下抛出 JobExecutionException 并且该类有标志来控制作业的重试行为,我认为 setRefireImmediately 就是你正在寻找的。
另请参阅: