如何解决Quarkus Quartz在超时后不会重启作业
我正在将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();
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。