gpt4 book ai didi

java - 定时器正在创建多个定时器实例

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:25:25 35 4
gpt4 key购买 nike

我想这是一个非常简单的问题,但我无法弄清楚为什么会这样。我有一个 EJB 计时器的实现,它使用 @Singleton 注释,即单例计时器。

我已将其设置为每 5 分钟运行一次。代码看起来像这样:

@Singleton
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class Scheduler {
private static final double timerVar = Math.random() * 33;

static Logger logger = Logger.getLogger("Scheduler");

@Schedule(second = "*", minute = "*/5", hour = "*", persistent = true)
public void doWork() {
logger.log(Level.INFO, "timer value for this session : " + timerVar);
}
}

当进程运行时,它会在 1 秒的间隔内同时执行 10 个调度程序实例,即

(EJB default - 1)
(EJB default - 2)
(EJB default - 3)
(EJB default - 4)

等等。当我在代码中放置一个冗长的操作时,(EJB default - 1) 不完整,当 (EJB default - 2) 尝试执行时,它给我一个错误说:

JBAS014373: EJB 3.1 PFD2 4.8.5.5.1 concurrent access timeout on org.jboss.invocation.InterceptorContext$Invocation@1b83ad52 - could not obtain lock within 5000 MILLISECONDS

首先,如何避免同时执行多个 EJB 调度程序实例?二、“5000MILLISECONDS内无法获取锁”是怎么回事,如何避免?

对于我得到的超时错误,我发现 JBOSS 队列中有很多工单,如前所述 here .


编辑

在最新评论中添加了代码,使其可读:

@Tushar-46835, could you expound upon your solution, maybe show us the snippet of what you did? – rtcarlson Oct 2 '14 at 20:12

@rtcarlson : Here is the code snippet which fixed my issues:

 @Resource 
TimerService timerService;

@Schedule(persistent = false, minute = "/30", hour = "")
public void checkQueueState() {
dt = new DataAccessFactory();
excvo = dt.canExecute();
dt = null;
available = excvo.isExecuteReady();
if (available) {
timerService.createSingleActionTimer(new Date(), new TimerConfig(null, false));
}
}

@Timeout
private void generateReport(Timer timer) {
logger.info("!!--timeout invoked here " + new Date());
}

最佳答案

First, how can I avoid multiple EJB scheduler instances to be executed at a time?

您正在创建持久计时器。所以在指定的时间间隔后,它将创建新的并将它们排入队列,等待前一个完成执行。

我推测,在您重新启动后,所有排队的计时器都会超时,并且服务器会创建多个实例,因为它们是持久的。

Second, what is the deal with "could not obtain lock within 5000MILLISECONDS" and how can I avoid it?

它是单例的,所有的方法默认都是锁式写的,所以一次只有一个线程在执行。因此其他人会得到超时异常/无法获得锁等。正如你所说,有一个长时间运行的过程。

关于java - 定时器正在创建多个定时器实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21896129/

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