[英]Parallelization of a scheduled task implemented as @Singleton in a clustered Java EE application
我目前正在開發一個 Java EE 應用程序,該應用程序將部署在 Payara 服務器 4 上。 payara 服務器在主機 1 上工作,還有 2 個實例(主機 1 和主機 2)可用作 Payara 集群。
我遇到的問題是,如果我們在單例類中安排一個任務,那么該任務將同時執行三次。 問題是2倍。
入口點看起來像這樣。 (不是全部。)
@ApplicationScoped
@Singleton
public class StartClass {
public void StartClass() {}
public void init(@Observes @Initialized(ApplicationScoped.class) ServletContext) throws ... { ... }
@Schedule(hour="*", minute="0", persistent=false)
public void runJob() {
MyClass my_class = new MyClass();
my_class.do_the_job();
}
}
這里我上面提到的計划任務是my_class.do_the_job()
。 這種方法只是在數據庫中插入一行,源代碼與本教程非常相似,並且有幾個System.out.println("DO_THE_JOB")
。 目標表有一列會自動填充插入的時間戳。 我還使用System.getenv("HOST")
放置了有關主機的信息。 結果是我們每小時插入三行:來自主機 1 的 2 行和來自主機 2 的 1 行。 但是println()
的結果可以在日志文件中找到一次。
筆記:
在 JEE 規范中,沒有辦法在集群范圍內使用@Singleton
。
解決此問題的一種可能選擇是使用特定於 Payara 的集群單例和額外的@Clustered
注釋。 它從 Payara 4.182 開始可用。
在這里閱讀更多關於它的信息Payara 集群單例
為什么會發生這種現象?
僅僅是因為 Singleton bean不可集群。 這意味着集群的每個節點都有自己的StartClass
實例。 您可能會在類似的 SO 問題上找到其他有用的信息。
我怎樣才能避免這種多次執行?
使用您當前的設置,您不能。 您可能需要的是一個支持集群的調度程序。 一個流行的選項是支持集群的quartz-scheduler 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.