Одиночный фоновый поток в контейнере EJB3.0 - PullRequest
2 голосов
/ 02 декабря 2010

Нам нужно запустить служебный поток в контейнере EJB3.0. В настоящее время у нас есть «TimerService» @Stateless EJB (необходим, потому что в него вставлены другие @EJBs), который создает интервальный EJB Timer при вызове его метода startTimer (). Должен быть только один экземпляр этого потока таймера. Текущее решение включает вызов startTimer () из метода init () одного из наших сервлетов, где сервлет вынужден загружаться при запуске с использованием файла web.xml, но это выглядит как случайное поведение вместо правильного способа выполнения действий , У нас уже была проблема, потому что кто-то еще подклассил этот сервлет, что означало, что init () вызывался дважды, что означало два потока таймера.

Такое ощущение, что это не необычное требование, так каков правильный способ сделать это, если что-нибудь? Мне кажется, что должен быть простой способ попросить контейнер запустить поток при запуске, не привязывая его к другим ресурсам в контейнере.

Ответы [ 3 ]

1 голос
/ 02 декабря 2010

Для EJB <3.1 вам нужно получить специфичный для сервера приложений или хакерский. Поскольку вы упоминаете, что используете JBoss, вы можете использовать тег @Management, который определил методы жизненного цикла. </p>

0 голосов
/ 02 декабря 2010

Я хочу предложить 2 решения.

1 Исправление вашей реализации.сделай свой сервлет окончательным.это позволит избежать подклассов.Но сервлет все еще может быть развернут дважды.Чтобы избежать этого, создайте статическую логическую переменную в сервлете.Init должен проверить эту переменную.Если оно ложно, оно превращается в истину и продолжается.В противном случае выдается исключение.

Это быстрое исправление, которое вы можете сделать сейчас.но это не "правильное" решение.Например, это не будет работать в кластерной среде.

2 Существует 2 «правильных» решения.

2.1.используйте кварц

2.2.Реализация таймера с использованием JCA.Connector - единственное место в J2EE, где вы можете легально использовать потоки и таймеры.

Я упоминал JCA в другом контексте в этой статье: http://alexradzin.blogspot.com/2010/10/send-delayed-jms-messages.html Вы можете просмотреть его и посмотреть пример короткого кода, который, вероятно, может вам помочь.

0 голосов
/ 02 декабря 2010

Поддерживает ли ваш сервер приложений "автозапчасти"?Я спрашиваю, потому что в WebSphere Application Server в административной консоли есть опция, позволяющая серверу запускать «бины запуска» при запуске сервера.Мы используем его для определенных приложений, которые требуют большой «большой нагрузки» и инициализации, так что мы можем минимизировать время запуска для конечного пользователя.Вот ссылка на документацию WAS 6 (я знаю, что она старая, но все же полезная). Запускаемые компоненты

Я знаю, что это специфично для IBM WebSphere, но, возможно, ваш сервер приложений (если не WebSphere) имеет нечто подобное, чтобы помочь вам запустить их?

...