[英]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
)。 兩者都可以是持久的或非持久的。
因此,要使用非持久計時器實現 singleton 服務,您需要設置某種配置,或在其中一個節點上觸發請求,以便它以編程方式創建計時器。
但請注意,如果該節點發生故障,計時器服務將不會執行。
使用Concurrency for Java EE
在ManagedScheduledExecutorService
中調度任務可以實現相同的行為。 但是 IMO 它對使用TimerService
以編程方式創建非持久計時器沒有任何優勢。 恰恰相反:創建計時器是事務性操作,而調度任務則不是。
然而,有一個 Wildfly 功能可以滿足您的需求: 高可用性 Singleton 部署。
您可以將模塊定義為 Singleton 部署。 該模塊部署到集群中,但僅在一個節點上處於活動狀態。 如果該節點發生故障,則在另一個節點中激活該模塊。
因此,您可以將您的EJB
與自動或以編程方式創建的計時器放在 singleton 模塊中,並且您可以在一個節點中執行並獲得高可用性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.