Распараллеливание запланированной задачи, реализованной как @Singleton в кластерном приложении Java EE - PullRequest
1 голос
/ 16 января 2020

В настоящее время я занимаюсь разработкой приложения 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"). В результате мы вставляем три строки каждый час: 2 строки с хоста 1 и 1 строку с хоста 2. Но результат println() можно найти один раз в файле журнала.

Примечания:

  • Использование JTA - не главное. Я хотел бы понять поведение приложения и кластера.
  • Java версия 8
  • Если должна быть другая соответствующая часть, дайте мне знать.

Ответы [ 2 ]

4 голосов
/ 16 января 2020

В спецификациях JEE c нет способа получить @Singleton для всего кластера.

Один из возможных способов обойти это - использовать кластеризованный Payara c синглтон с дополнительной аннотацией @Clustered. Он доступен начиная с Payara 4.182.

Подробнее об этом можно прочитать здесь Скопленный синглтон Payara

0 голосов
/ 16 января 2020

Почему происходит это явление?

Просто потому, что синглтон-бины не могут быть сгруппированы . Это означает, что каждый узел кластера имеет свой собственный экземпляр StartClass. Вы можете найти дополнительную полезную информацию по аналогичному вопросу SO .

Как мне избежать такого многократного выполнения?

При текущей настройке вы не можете . Возможно, вам нужен планировщик, который поддерживает кластеризацию. Популярным вариантом является кварцевый планировщик , который поддерживает кластеризацию.

...