我在春季项目中使用石英。这个想法是为新的收入数据创建一个单独的工作,该工作没有成功地交付给目标服务。
我试图管理JobExecutionContext
触发的作业,以使用相同的JobDetail
在quartzScheduler
中注册它。想法是用不同的触发器更新现有作业。但是问题是石英试图创建将其持久保存在数据库中的新作业。
org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'digex-caas-securepay.b333e5bf-583f-4643-9ad7-ef4b913001f7', because one already exists with this identification.
at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeJob(JobStoreSupport.java:1113) ~[quartz-2.3.0.jar:na]
at org.quartz.impl.jdbcjobstore.JobStoreSupport$2.executeVoid(JobStoreSupport.java:1067) ~[quartz-2.3.0.jar:na]
at org.quartz.impl.jdbcjobstore.JobStoreSupport$VoidTransactionCallback.execute(JobStoreSupport.java:3765) ~[quartz-2.3.0.jar:na]
at org.quartz.impl.jdbcjobstore.JobStoreSupport$VoidTransactionCallback.execute(JobStoreSupport.java:3763) ~[quartz-2.3.0.jar:na]
at org.quartz.impl.jdbcjobstore.JobStoreCMT.executeInLock(JobStoreCMT.java:245) ~[quartz-2.3.0.jar:na]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeJobAndTrigger(JobStoreSupport.java:1063) ~[quartz-2.3.0.jar:na]
at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:855) ~[quartz-2.3.0.jar:na]
at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:249) ~[quartz-2.3.0.jar:na]
at com.incomm.ecomm.services.quartz.OrderQuartzJobScheduler.registerSecurePayPostServiceJob(OrderQuartzJobScheduler.java:59) ~[classes/:na]
答案 0 :(得分:1)
答案 1 :(得分:1)
scheduler.rescheduleJob(trigger.getKey(), trigger);
- 如何通过石英作业触发器更新进行管理
scheduler.rescheduleJob(trigger.getKey(),触发器);
- 如何通过石英作业更新进行管理
如果触发器已更新,则不再重要。
- 如何为触发注册呈指数增长的延迟时间策略?
单个触发器可以在任何不同的时间进行重新安排。可以使用IntervalCalculationStrategy
的任何实现来计算下一次执行的时间。
可以从JobExecutionContext
获取职位和职位详细信息,但这不是必需的。触发器只能连接到一个作业,因此足以更新石英指定triggerKey
:
@Autowired
private Scheduler scheduler;
@Autowired
private IntervalCalculationStrategy intervalCalculation;
public <T extends QuartzJobBean> void registerSecurePayPostServiceJob(
JobExecutionContext firedJobExecutionContext) {
Optional<SimpleTriggerImpl> mutableTrigger =
ofNullable(firedJobExecutionContext)
.map(JobExecutionContext::getTrigger)
.filter(SimpleTriggerImpl.class::isInstance)
.map(SimpleTriggerImpl.class::cast);
try {
if (mutableTrigger.isPresent()) {
SimpleTriggerImpl trigger = mutableTrigger.get();
int nextAttemptNumber = trigger.getTimesTriggered();
log.trace("trigger: {} fired [{}] times", trigger.getFullName(),
trigger.getTimesTriggered());
trigger.setStartTime(intervalCalculation.calculateNextTryDate(nextAttemptNumber));
this.scheduler.rescheduleJob(trigger.getKey(), trigger);
}
} catch (SchedulerException e) {
log.error("job was not rescheduled <{}>", firedJobExecutionContext.getJobDetail(), e);
}
}