簡體   English   中英

在wildfly中運行的EJB調度中避免計時器重疊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM