2010-12-02 3 views
2

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

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

+0

возможно имеющий отношение? http://stackoverflow.com/questions/2707733/eager-auto-loading-of-ejb-load-ejb-on-startup-on-jboss – Bozho 2010-12-02 13:47:03

+0

Спасибо - принятый ответ относится к EJB3.1, который мы не но интерес представляет другой ответ, в котором упоминается, что наилучшим способом до 3.1 является решение, которое мы используем в настоящее время :( – RevBingo 2010-12-02 13:49:47

ответ

0

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

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

0

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

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

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

2 Есть 2 "правильных" решения.

2.1. использование кварца

2.2. Внедрить таймер с помощью JCA. Коннектор - единственное место в J2EE, где вы можете легально использовать потоки и таймеры.

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

1

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