簡體   English   中英

是否可以創建 Singleton 非持久 ejb 計時器?

[英]is it possible to create Singleton non-persistent ejb timer?

我正在使用帶有 @schedule 注釋的 EJB 自動計時器服務。 但是,我需要以下幫助。

我需要一個 singleton 時間服務(僅在集群中的一個節點上執行),但不想在服務器重啟或崩潰期間執行錯過的計時器。

我閱讀了很多文章,但每個人都在提到持久計時器以在集群環境中實現 singleton 行為。

我的代碼:

@Singleton
@Startup
public class DataService {
     @Schedule(second="*/10", minute="*", hour="*", persistent=false)
     public void xxxFetch() {
         // business logic
     }
}

有沒有辦法用非持久定時器實現 Singleton 服務?

此行為在 EJB 3.2 規范中定義(第 13.2.2、13.2.3、13.2.4 和 13.4.4 節)。

有兩種類型的計時器,自動創建的計時器(帶有注釋),或以編程方式注釋的計時器(使用TimerService )。 兩者都可以是持久的或非持久的。

  • 持久計時器(自動或以編程方式創建)將僅在一個節點中運行。
  • 非持久性自動創建的計時器將在集群中的每個節點上運行。
  • Non Persistent 以編程方式創建的計時器將僅在它們創建的節點上運行。

因此,要使用非持久計時器實現 singleton 服務,您需要設置某種配置,或在其中一個節點上觸發請求,以便它以編程方式創建計時器。

但請注意,如果該節點發生故障,計時器服務將不會執行。

使用Concurrency for Java EEManagedScheduledExecutorService中調度任務可以實現相同的行為。 但是 IMO 它對使用TimerService以編程方式創建非持久計時器沒有任何優勢。 恰恰相反:創建計時器是事務性操作,而調度任務則不是。

然而,有一個 Wildfly 功能可以滿足您的需求: 高可用性 Singleton 部署

您可以將模塊定義為 Singleton 部署。 該模塊部署到集群中,但僅在一個節點上處於活動狀態。 如果該節點發生故障,則在另一個節點中激活該模塊。

因此,您可以將您的EJB與自動或以編程方式創建的計時器放在 singleton 模塊中,並且您可以在一個節點中執行並獲得高可用性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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