我在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秒)。但是破解更新方法意味着在更新过程中中断整个数据结构,至少目前是复杂且不可靠的。
感谢任何帮助!
答案 0 :(得分:2)
我同意dgebert,因为默认的ConcurrencyManagement是容器管理的,默认锁是写除非,除非您有集群。在群集中,每个节点都有自己的单调和锁定管理。如果不配置用于计时器服务的中央数据库,则将执行所有节点并在底层数据结构中引发并发问题。
答案 1 :(得分:1)
你的"计时器"是什么类型的豆?豆?我认为将它变成@Singleton对你的情况来说已经足够了。如果它是Singleton,则无法通过多个线程访问该方法。