Java EE и фоновые потоки - PullRequest
0 голосов
/ 16 марта 2012

Я пытаюсь определить подход «одобренного» или передового опыта в среде Java EE для выполнения следующих действий: клиент находится на веб-странице и нажимает кнопку.Это запускает поток для мониторинга процесса, то есть активности базы данных, сети и т. Д. Этот процесс будет продолжаться до тех пор, пока пользователь не нажмет кнопку, сообщающую об окончании процесса.Другие клиенты и / или тот же клиент затем нажимают кнопку, чтобы прослушать статус, отправляемый этим процессом, который будет продолжать прослушивание, пока пользователь не нажмет кнопку, чтобы прекратить прослушивание.

Я уже сделал вышеупомянутое, используя WebSocket для связи с сервлетом, который получает внедренный одноэлементный EJB, который расширяет WebSocketApplication.Но этот EJB порождает поток процесса для мониторинга.Хотя он работает и должен продолжать работать, поскольку он является одноэлементным, это не «одобренный» способ сделать это.

Некоторые предложения, которые я рассмотрел, обсуждают использование JMS для порождения потока, но, если я ненеправильное понимание чего-либо, это ничего не решает, так как бин, управляемый сообщениями, также не должен порождать поток.Итак, что такое одобренный / лучший метод для этого?Как запустить и остановить фоновый процесс в среде Java EE?Опять же, требования заключаются в том, что может быть создан только один процесс, он должен взаимодействовать со всеми WebSockets, которые регистрируются в сервлете, он должен быть в состоянии умереть, когда ему сообщают (хотя это не означает, что сервер закрывает сокеты, поскольку он можетначать резервное копирование и все равно будет общаться со всеми ранее зарегистрированными клиентами).

Спасибо.

Ответы [ 4 ]

1 голос
/ 22 октября 2013

Для создания потоков в корпоративной среде вы должны использовать либо ManagedThreadFactory, либо ManagedExecutorService.

Пожалуйста, смотрите здесь

1 голос
/ 16 марта 2012

этот EJB порождает поток процесса

EJB не разрешено запускать потоки .По стандарту:

Корпоративный компонент не должен пытаться управлять потоками.Корпоративный компонент не должен пытаться запускать, останавливать, приостанавливать или возобновлять поток или изменять приоритет или имя потока.Внутренний компонент не должен пытаться управлять группами потоков.

Эти функции зарезервированы для контейнера EJB.Разрешение корпоративному бину управлять потоками уменьшит способность контейнера правильно управлять средой выполнения.

Это сделано специально;спецификация гласит следующее

Архитектура Enterprise JavaBeans облегчит написание приложений: разработчикам приложений не придется понимать подробные сведения об управлении транзакциями и состоянием низкого уровня, многопоточности, пуле соединений илидругие сложные низкоуровневые API.

Рассматривали ли вы использование сессионного компонента с состоянием?Нажатие на кнопку приводит к тому, что компонент входит в состояние «запущено».Нажатие на вторую кнопку заставляет бин войти в состояние «остановлено».

0 голосов
/ 15 декабря 2015

Начиная с Java EE 7, вы можете использовать ManagedExecutorService для предоставления вашим EJB-доступам доступа к пулу управляемых потоков.

0 голосов
/ 18 марта 2012

Ответ - асинхронный компонент EJB 3.1. Спасибо за ответ.

...