我正在将Quarkus和Quartz一起使用,以计划将HttpRequests发送到外部API并将其响应数据保存到我的数据库中的单个作业。
该作业在最后一个作业结束后重新启动,我使用的是@DisallowConcurrentExecution,因此一次仅运行一个作业实例。
我每个工作至少要执行100个异步请求,这有时会花费很多时间。这些请求有时会触发事务超时,这会完全杀死Quartz作业。 我试图在工作中捕获异常,但是将它扔到了其他地方。
我设法通过将quarkus.transaction-manager.default-transaction-timeout
设置为一个很小的值来复制问题,但是我不知道在超过事务超时限制后如何重新启动作业。有什么想法吗?
是的,我知道我可以将超时设置为一个很大的值,但是我更喜欢作业失败并重新启动。
Quartz Scheduler设置
@ApplicationScoped
public class MyScheduler {
@Inject
Scheduler quartz;
void onStart(@Observes StartupEvent event) throws SchedulerException {
JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("Job", "group")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("Trigger","group")
.startNow()
.withSchedule(
SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(1)
.repeatForever()
)
.build();
quartz.scheduleJob(job, trigger);
}
}
MyJob.class:
@DisallowConcurrentExecution
@ApplicationScoped
public class MyJob implements Job {
@Inject
EntityManager em;
@Transactional
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
getData();
} catch(Throwable e) {
e.printStackTrace();
}
}
}