在群集的Java EE应用程序中以@Singleton实现的计划任务的并行化

我目前正在开发Java EE应用程序,该应用程序将部署在Payara服务器4上。payara服务器在主机1上运行,并且还有两个实例(主机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()。该方法只是在数据库中插入一行,其源代码与this tutorial非常相似,并且具有多个System.out.println("DO_THE_JOB")。目标表具有一列,该列将自动使用插入的时间戳进行填充。我还使用System.getenv("HOST")放置了有关主机的信息。结果是我们每小时插入三行:主机1排2行,主机2排1行。但是println()的结果只能在日志文件中找到一次。

注意:

  • 使用JTA并不是重点。我想了解应用程序和集群的行为。
  • Java版本是8
  • 如果还有其他相关部分,请告诉我。
js20090617 回答:在群集的Java EE应用程序中以@Singleton实现的计划任务的并行化

在JEE规范中,无法拥有整个集群范围的@Singleton

解决此问题的一种可能方法是使用特定于Payara的群集单例以及附加的@Clustered批注。从Payara 4.182开始可用。

在这里Payara clustered singleton

了解更多信息 ,

为什么会发生这种现象?

仅是因为Singleton bean 无法集群。意味着集群的每个节点都有自己的StartClass实例。您可能会在类似的question上找到更多有用的信息。

如何避免这样的多次执行?

使用当前设置,不能。您可能需要一个支持群集的调度程序。流行的选项是quartz-scheduler,它支持集群。

本文链接:https://www.f2er.com/2758181.html

大家都在问