编程语言
首页 > 编程语言> > java-避免在wildfly中运行的EJB调度中的计时器重叠

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

作者:互联网

我在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是容器管理的,而默认锁定是write.在群集中,每个节点都有自己的单调和锁定管理.如果您不为计时器服务配置中央数据库,则将执行所有节点并在底层数据结构中引发并发问题.

标签:timer,wildfly-10,java,java-ee,ejb-3-2
来源: https://codeday.me/bug/20191110/2015443.html