В настоящее время я занимаюсь разработкой приложения 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
- Если должна быть другая соответствующая часть, дайте мне знать.