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

问题描述 投票:3回答:2

我在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默认值 - 1)WFLYEJB0043:之前执行的timer []仍在进行中,跳过此重叠的计划执行:。

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

此外,重叠会引起更新下的底层数据结构中的并发问题。

我的问题:

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

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

顺便说一下,我想过将更新方法分成两个不同的时间表(1秒和120秒)。但是破解更新方法意味着在更新下中断整个数据结构,至少目前至少复杂且不可靠。

任何帮助表示赞赏!

java java-ee timer wildfly-10 ejb-3.2
2个回答
2
投票

我与dgebert签约,因为默认的ConcurrencyManagement是容器管理的,默认锁是write,除非你有一个集群。在集群中,每个节点都有自己的单线程和锁定管理。如果您没有为计时器服务配置中心数据库,则将执行所有节点并引发底层数据结构中的并发问题。


1
投票

什么样的豆是你的“计时器”豆?我认为将它变成@Singleton对你的情况来说已经足够了。如果它是Singleton,则无法通过多个线程访问该方法。

© www.soinside.com 2019 - 2024. All rights reserved.