Пакетное задание застревает в STARTING при отправке из JMS Listener onMessage()

Я пытаюсь запустить пакетные задания в соответствии со спецификациями JSR 352, используя JobOperator, полученный из BatchRuntime, в методе onMessage(...) в JMS MessageListener.

JobOperator jobOperator = BatchRuntime.getJobOperator();
Properties props = new Properties();
props.setProperty("sourceFile", "data_file.csv");
jobOperator.start("batchTask", props);

В результате выполнение задания застревает на STARTING. Когда я пытаюсь остановить задачу из того же потока, она также зависает на ОСТАНОВКЕ.

Запуск того же задания из простого HttpServlet выполняется немедленно. Почему это так?


person kosgeinsky    schedule 02.07.2017    source источник
comment
Когда вы говорите MessageListener, вы конкретно имеете в виду что-то помимо MDB? Если да, то, вероятно, проблема в этом.   -  person Scott Kurz    schedule 03.07.2017


Ответы (1)


Вы должны использовать MDB для приема сообщения JMS на сервере приложений EE, а не свой собственный MessageListener. (См. здесь.)

Пакетная обработка должна выполняться в управляемом потоке, чтобы были доступны контексты EE, чтобы API-интерфейсы EE, такие как ManagedExecutorService, используемые в качестве пакетного "пула потоков", работали правильно.

Также будут потенциальные проблемы с другими API EE, помимо пакетной обработки (и, возможно, других функций сервера приложений) при использовании неуправляемых потоков, поэтому MDB является здесь необходимым подходом.

person Scott Kurz    schedule 03.07.2017
comment
Спасибо, Скотт, у меня наверняка были пробелы в понимании среды EE. Мой MessageListener работал как экземпляр @javax.inject.Singleton. Ваши три абзаца также ответили на большее количество моих вопросов. - person kosgeinsky; 04.07.2017