微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。