gpt4 book ai didi

java - 避免在 wildfly 中运行的 EJB 调度中的计时器重叠

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:34:05 25 4
gpt4 key购买 nike

我在 Wildfly 10.10 中运行的单例 EJB 中有一个 EJB 计时器计划:

@Singleton
@Startup
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class MySingletonBean {

public method() {
//uses synchronization primitives to fine control the concurrent access
}

@Schedule(hour = "*", minute = "*", second = "*", persistent = false)
public void update() {
//each 120 seconds update method timeouts and the overlapping/log message occurs
}
}

update() 模型中的任务运行平稳,大部分时间不到 1 秒。但是每2分钟,由于业务需要,该​​方法超时时间超过1秒。

问题:

每 2 分钟 wildfly 输出一条日志消息,如下所示:

(EJB default - 1) WFLYEJB0043: A previous execution of timer [] is still in progress, skipping this overlapping scheduled execution at: .

我很清楚该消息的含义:上一个计时器在下一个执行开始之前没有完成,并且发生了重叠。

此外,重叠会在更新的基础数据结构中引发并发问题。

我的问题:

1 - 如何在计时器缓慢避免重叠/并发更新的情况下丢弃下一个计划?

2 - 如果不可能丢弃重叠的时间表,如何避免日志消息?

顺便说一句,我考虑过将更新方法分成两个不同的时间表(1 秒和 120 秒)。但打破更新方法意味着在更新过程中过度打破整个数据结构,至少在某种程度上是复杂且不可行的。

感谢任何帮助!

最佳答案

我同意 dgebert 的观点,因为默认的 ConcurrencyManagement 是容器管理的,默认锁是写入除非你有一个集群。在集群中,每个节点都有自己的单例和锁管理。如果您不为定时器服务配置一个中心数据库,所有节点都将被执行并在底层数据结构中引发并发问题。

关于java - 避免在 wildfly 中运行的 EJB 调度中的计时器重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46924287/

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