簡體   English   中英

在集群的 Java EE 應用程序中並行化作為 @Singleton 實現的計划任務

[英]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()的結果可以在日志文件中找到一次。

筆記:

  • JTA 的使用不是重點。 我想了解應用程序和集群的行為。
  • Java 版本是 8
  • 如果還有其他相關部分,請告訴我。

在 JEE 規范中,沒有辦法在集群范圍內使用@Singleton

解決此問題的一種可能選擇是使用特定於 Payara 的集群單例和額外的@Clustered注釋。 它從 Payara 4.182 開始可用。

在這里閱讀更多關於它的信息Payara 集群單例

為什么會發生這種現象?

僅僅是因為 Singleton bean不可集群 這意味着集群的每個節點都有自己的StartClass實例。 您可能會在類似的 SO 問題上找到其他有用的信息。

我怎樣才能避免這種多次執行?

使用您當前的設置,您不能 您可能需要的是一個支持集群的調度程序。 一個流行的選項是支持集群的quartz-scheduler

暫無
暫無

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

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