Quarkus Quartz在超时后不会重启作业

时间:2020-09-30 13:02:48

标签: java quarkus quartz timeoutexception

我正在将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();
        }
    }
}

0 个答案:

没有答案
相关问题