gpt4 book ai didi

java - 增加 Thorntail 中计划任务的超时时间

转载 作者:行者123 更新时间:2023-12-02 09:28:11 28 4
gpt4 key购买 nike

我正在 Thorntail 中编写一个计划任务,该任务将运行很长时间(大约 30 分钟)。然而,Thorntail 似乎将执行时间限制为 30 秒。

我的代码如下所示(我删除了我认为不相关的代码):

@Singleton
public class ReportJobProcessor {

@Schedule(hour = "*", minute = "*/30", persistent = false)
public void processJobs() {
// Acquire a list of jobs

jobs.forEach(this::processJob);
}

private void processJob(ReportJob job) {
// A long running process
}
}

30 秒后,我在日志中看到以下内容:

2019-10-01 16:15:14,097 INFO [org.jboss.as.ejb3.timer] (EJB default - 2) WFLYEJB0021: Timer: [id=... timedObjectId=... auto-timer?:true persistent?:false timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@42478b98 initialExpiration=null intervalDuration(in milli sec)=0 nextExpiration=Tue Oct 01 16:20:00 CEST 2019 timerState=IN_TIMEOUT info=null] will be retried

又过了 30 秒,由于作业仍未完成,因此抛出异常。

我不知道如何增加超时,并且谷歌搜索我的问题没有返回任何帮助。

如何将超时时间增加到 30 秒以上?

最佳答案

我建议您采取一些不同的方法。

计划任务将作业分发到名为 ReportJobExecutor 的异步运行的无状态 session Bean (SLSB),并在作业分发后立即完成,不会超时。同时运行的 SLSB 数量可以在 project-defaults.yml 中调整,默认数量为 16,IIRC。这是一个非常基本的示例,但演示了使用 EJB 计时器调用的预定义 bean 池的 Java EE 执行。更复杂的例子是手动池化执行器,它允许您控制执行器的生命周期(例如在指定时间后杀死它们)。

@Singleton
public class ReportJobProcessor {

@Inject ReportJobExecutor reportJobExecutor;

@Schedule(hour = "*", minute = "*/30", persistent = false)
public void processJobs() {
// Acquire a list of jobs

jobs.forEach(job -> reportJobExecutor.run(job));
}
}

@Stateless
@Asynchronous
public class ReportJobExecutor {

public void run(ReportJob job) {
//do whatever with job
}
}

想法#2:另一种方法是使用 Java 批处理 API (JSR 352),不幸的是,我不熟悉这个 API。

关于java - 增加 Thorntail 中计划任务的超时时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58186825/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com