Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск EJB таймера при старте приложения, как сделать ? 
V
    Опции темы
vzf
Дата 10.11.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 10.9.2005

Репутация: 2
Всего: 5



Добрый день. 

У меня есть ejb таймер и мне бы хотелось сделать так, чтоб он запускался в момент запуска j2ee приложения, а останавливался при остановке приложения. Вопрос: как это правильно сделать ? У меня чисто ejb приложение, нет веба. На сервере ejb, обращение к ним идет из desлtop-клиента. Был бы веб, можно было бы в листенере сервлета прописать запуск и остановку таймера...
Товарищи, никто из вас не подскажет какой-нибудь другой способ реализации запуска и остановки таймера ? Или придется все-таки делать сервлет только ради запуска таймера ?

Буду благодарен советам smile 
--------------------
Java - Write Once, Test EveryWhere!
PM MAIL   Вверх
powerOn
Дата 10.11.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 28
Всего: 159



Цитата(vzf @  10.11.2008,  16:30 Найти цитируемый пост)
У меня есть ejb таймер и мне бы хотелось сделать так, чтоб он запускался в момент запуска j2ee приложения,


на деплой EJB модуля, насколько мне известно, лисенера не повесить, только если какие-то серверозависимые пути решения искать. 
Либо, подойти к вопросу с другой точки зрения, спросив себя: "А что значит момент старта приложения?" и "А не сделать ли мне "момент старта приложения" в момент первого обращения к какому-либо бину?" Тогда быть может и решение будет простым ;-)



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
MisterCleric
Дата 11.11.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



powerOn

Вполне логичный ответ. Я в свое время тоже тоже боролся с такой проблемой - хотел поднят спринг-контекст сразу после деплоя ear. Порылся в гугле и нашел решение через JMX. В спринге стартовал подобный ejb таймер. Ну и типа запрашивал сущности с базы для кеширования. А потом понял, что излишняя задача: сущности кешировать можно и по перевому запросу, а сам таймер стартовать как раз MBean'ом... Ему можно сказать депенденс от деплоя ear. и сразу после этого в методе старт вызывал метод бина createTimer()...

думаю, суть понятна.



--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
KostenkoSergey
Дата 17.11.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 31.10.2005
Где: Kiev

Репутация: 3
Всего: 8



Для некоторых апп-серверов (например WAS), есть возможность "запускать EJB при запуске приложения".

С другой стороны если взглянуть на "лучшие практики", то "методов" автоматического запуска ежб-таймера всего три:

1.  Create the timer by invoking the EJB method. (нам не падходит)
2.   Use a Startup class using the proprietary API of your J2EE container. (спорноый вариант, с точки зрения переносимости)
3.  Create a servlet and implement the init method to invoke the EJB method that creates the timer. Set the load-on-startup property for the servlet to automatically start the servlet when the web module is started. (Бинго !) smile


Как мне кажется, именно связка  "ServletContextListener-EJB" и будет подходящим решением для Вашей задачи.

PM ICQ   Вверх
w1nd
Дата 18.11.2008, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 7
Всего: 54



С сверлетом тоже может не срастись - на некоторых серверах и не срастается. В JCA 1.5 появилась возможность создавать такие штуки, которые на жизненный цикл приложения могут реагировать. А JCA 1.5, ЕМНИП, везде реализована.


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Evgeni68
Дата 18.11.2008, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 9.7.2007

Репутация: 1
Всего: 3



На JBoss момент старта/остановки сервера, deploy/undeploy приложения отслеживали при помощи MBean-а, у которого существуют callback методы жизненного цикла.
Правда наследовали от специфичного для JBoss класса ServiceMBeanSupport.
PM MAIL   Вверх
mbasil
Дата 20.11.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 9
Всего: 13



Если у Вас не легкий EJB контейнер, то в любом сервере приложений web контейнер всегда будет иметь место, используете ли вы его - или нет.

В одном примере Sun встретил такой пример:
Код

import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
import javax.ejb.*;
import ejbcomponents.*;

public class SchedulerContextListener implements ServletContextListener {

    @EJB private StockMessageGeneratorRemote msgGen;
    
    public void contextInitialized(ServletContextEvent evt) {
        ServletContext ctx = evt.getServletContext();
        String interval = ctx.getInitParameter("interval");
        
        if(interval == null) {
            interval = "10";
        }
        
        String delemitedStocks = ctx.getInitParameter("stocks");
        Object o = new ...;

        msgGen.scheduleTimer( o, interval );
    }
    public void contextDestroyed(ServletContextEvent evt) { }
}


По моему это самый подходящий вариант, так как
1. Это предпочтительней сервлета и срабатывает именно при старте приложения.
2. Компоненты типа MBean разные на каждом сервере и это потребует при переносе выполнять изменениея.

PM MAIL   Вверх
MisterCleric
Дата 21.11.2008, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Вопрос по поводу переноса:
А часто ли вам в своей практике приходиться переносить приложение с одного контейнера на другой?
Я вот за три года работы дальше JBOSS и TomCat не пошел - нету требований на другие сервера приложений. 
Да хоть и этак при переезде все-равно придеться что-то переделывать. Не ужели нельзя будет и старт EJB-таймера реализовать конкретно под сервер? Что-то мне подсказывает, что переделывать-то всего лишь наследование от контейнер-зависимых классов и интрерфейсов.
Наверное, мин 5 работы. с переписыванием и компиляцией...


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
w1nd
Дата 21.11.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 7
Всего: 54



Цитата(MisterCleric @  21.11.2008,  10:06 Найти цитируемый пост)
Что-то мне подсказывает, что переделывать-то всего лишь наследование от контейнер-зависимых классов и интрерфейсов.Наверное, мин 5 работы. с переписыванием и компиляцией...

Вопрос в том, что вам нужно - переносить приложение или сделать переносимым. В принципе, в каждом сервере есть некоторые средства, которые позволят вам получить нужный функционал, но на переделку уйдёт не пять минут, а уж сколько уйдёт на изучение вопроса...

Это сообщение отредактировал(а) w1nd - 21.11.2008, 11:56


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
mbasil
Дата 21.11.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 9
Всего: 13



To MisterCleric
Парадокс заключается в том, что в настоящее время все больше и больше задач, которые становятся типовыми, мы выносим из приложения и возлагаем ответственность за их выполнение на сервер приложений.
Зачастую к таким задачам теперь относится:
1. Настройка пула подключений к базе данных.
2. Создание источников данных и помещение их в JNDI.
3. Аутентификация пользователей.
4. Авторизация пользователей.
5. и т.п.
Проблема заключается в том, что все эти решения не стандартизованы, а реализация всегда специфическая для вендора сервера приложения. Причем поставщики серверов как будто соревнуются в том, чтобы предложить решения отличающиеся от других.
Одно решение переделать под новый сервер можно быстро, а много не связанных друг с другом?
1. Использование MBean оправдано и весьма хорошо в тех случаях, когда задачу нельзя решить средствами приложения.
2. Полагаться на решения для конкретного сервера волей-неволей придется. Однако здесь нужен здоровый компромисс.
3. Переносить приложение может и не понадобится, но не учитывать несовместимость серверных решений неправильно. 
Это всего лишь мое мнение и я излагаю его вследствие того, что это затронул MisterCleric
Меня уже упрекали модераторы за то, что я выхожу за пределы вопроса тописка, поэтому я заранее прошу прощения.

Это сообщение отредактировал(а) mbasil - 21.11.2008, 12:14
PM MAIL   Вверх
KostenkoSergey
Дата 25.11.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 31.10.2005
Где: Kiev

Репутация: 3
Всего: 8



Цитата(MisterCleric @  21.11.2008,  10:06 Найти цитируемый пост)
А часто ли вам в своей практике приходиться переносить приложение с одного контейнера на другой?


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

Я пару месяцев назад закончил перевод проектов с BEAS на WAS - так вот, было много моментов написанных не по спецификации а под конкретное API серверов - та ещё головная боль при переносе...
PM ICQ   Вверх
vzf
Дата 27.11.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 10.9.2005

Репутация: 2
Всего: 5



Цитата(KostenkoSergey @ 17.11.2008,  16:25)
Для некоторых апп-серверов (например WAS), есть возможность "запускать EJB при запуске приложения".

С другой стороны если взглянуть на "лучшие практики", то "методов" автоматического запуска ежб-таймера всего три:

1.  Create the timer by invoking the EJB method. (нам не падходит)
2.   Use a Startup class using the proprietary API of your J2EE container. (спорноый вариант, с точки зрения переносимости)
3.  Create a servlet and implement the init method to invoke the EJB method that creates the timer. Set the load-on-startup property for the servlet to automatically start the servlet when the web module is started. (Бинго !) smile


Как мне кажется, именно связка  "ServletContextListener-EJB" и будет подходящим решением для Вашей задачи.


Цитата

Если у Вас не легкий EJB контейнер, то в любом сервере приложений web контейнер всегда будет иметь место, используете ли вы его - или нет.


У меня не было ни одного сервлета в приложении. 

Цитата

У меня чисто ejb приложение, нет веба. На сервере ejb, обращение к ним идет из desлtop-клиента. Был бы веб, можно было бы в листенере сервлета прописать запуск и остановку таймера...


Но, алилуя ! В проекте появился небольшой веб-модуль с одним служебными сервлетом, поэтому запуск таймера я сделал в ServletContextListener.

Ура ! smile
--------------------
Java - Write Once, Test EveryWhere!
PM MAIL   Вверх
mbasil
Дата 27.11.2008, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 9
Всего: 13



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

ServletContext это на самом деле контекст приложения.
ServletContextListener это на самом деле прослушиватель старта и завершения работы приложения и прямого отношения к какому-либо сервлету не имеет.
PM MAIL   Вверх
vzf
Дата 28.11.2008, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 10.9.2005

Репутация: 2
Всего: 5



Понятно, не знал этого, спасибо smile 
--------------------
Java - Write Once, Test EveryWhere!
PM MAIL   Вверх
MisterCleric
Дата 28.11.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



А я бы сказал, что ServletContextListener имеет косвенное отношение к сервлетам - все-таки он лежит в пакете javax.servlet. Да и его экземпляр и вызовы методоп происходят в сервлет-контейнере...
т.е. варничеч с web.xml все-равно придется создавать


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1103 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.