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