Двойное выполнение задания в кластере WebSphere WorkManager - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть Приложение, развернутое в WebSphere 8.5 с Java 1.7.1, с кластером из 2 узлов. В этом приложении есть EJB-компонент, который через менеджера работ отправляет асинхронное задание.

Проблема в том, что в WAS 8.5 Задание выполняется два раза на обоих узлах кластера. В WAS 6.1 этого не произошло.

Работа представлена ​​Менеджером тревог. Ниже извлеченный код:

WorkManager wm = serviceLocator.getWorkManager("NameOfCustomWorkManager");            
AsynchScope scope = wm.findAsynchScope("scopeName");

if (scope == null) 
    scope = wm.createAsynchScope("scopeName");

AlarmManager alarmManager = scope.getAlarmManager();        

alarmManager.create(listener, "Alarm Context Info", (int) (DateUtils.getNextTime(nextTime) - System.currentTimeMillis()));  --Fired on a certain hours     

logger.info("Alarm fired.");

Кто-нибудь знает, если на 8.5 была дополнительная конфигурация, чтобы избежать описанной проблемы?

1 Ответ

0 голосов
/ 24 апреля 2018

WorkManager в WebSphere Application Server, независимо от версии, не имеет и никогда не имел возможности работать или координировать действия с удаленными JVM.Спроектированное поведение WorkManager заключается в том, что он может запускать работу, которую вы отправляете, только в той же JVM, из которой вы отправили работу, и что он не знает о дублировании работы, которую вы отправляете из другой JVM, и не имеет механизма длякоординация работы через JVM.То же самое относится к экземплярам AlarmManager, которые вы получаете из WorkManager.(У сервера приложений WebSphere на самом деле есть способ выполнить описанное выше, то есть планировщик, но в приведенном выше коде это не используется).Возможно ли, что какая-то более ранняя логика в приложении, на которую повлияло изменение версии, могла теперь вызывать создание Alarm на обоих элементах, тогда как ранее она создавалась только на одном?

...