![](/img/trans.png)
[英]EJB Timer (@Schedule) not recognized by WildFly when inside a JAR which is also inside an EAR
[英]Avoid timer overlapping in EJB schedule running inside wildfly
我在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秒)。 但是破解更新方法意味着在更新下中斷整個數據結構,至少目前至少復雜且不可靠。
任何幫助表示贊賞!
我與dgebert簽約,因為默認的ConcurrencyManagement是容器管理的,默認鎖是write, 除非你有一個集群。 在集群中,每個節點都有自己的單線程和鎖定管理。 如果您沒有為計時器服務配置中心數據庫,則將執行所有節點並引發底層數據結構中的並發問題。
什么樣的豆是你的“計時器”豆? 我認為將它變成@Singleton對你的情況來說已經足夠了。 如果它是Singleton,則無法通過多個線程訪問該方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.