![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Girin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 6.2.2008 Репутация: нет Всего: нет |
Есть проблема - необходимо реализовать аналог Message Driven Bean на базе сервлет контейнера, в моем случае Jetty. То есть наличие полноценного J2EE сервера приложений не подразумевается. В качестве провайдера очереди сообщений на которую нужно настроить слушатель предполагается использовать либо Websphere MQ либо ActiveMQ.
Можно установить дополнительно на Jetty реализации EJB контейнеров, такие как OpenEJB, но хотелось бы узнать есть ли другие варианты реализации слушателя очереди сообщений. Каким образом можно реализовать аналог метода onMessage() в контексте вышеозвученного вопроса ? |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 4 Всего: 43 |
http://activemq.apache.org/hello-world.html .
В примере HelloWorldConsumer выполняет функцию МДБ. А куда этот код вставлять непринципиально. |
|||
|
||||
| Girin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 6.2.2008 Репутация: нет Всего: нет |
Да, спасибо интересный вариант. Но в приведенном примере как я понимаю standalone приложение, т.е. запускаемое вне контекста сервера. Есть ли варианты реализовать подобное в виде серверного ПО или можно просто задеплоить пример из ссылки на сервер (сервлет-контейнер) |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 4 Всего: 43 |
Это всего лишь простой пример, как создать издателя и потребителя для очереди сообщений ActiveMQ.
Если вы хотите, чтобы приложение ( в вашем случае это, очевидно, веб-приложение) получало из очереди сообщения, значит надо в приложение добавить класс, который создаст обьект потребителя (consumer) и зарегистрирует его во внешней очереди. Там должен быть также запущен поток, который в цикле ожидает нового сообщения из очереди:
Метод receive(..) и есть аналог метода onMessage(Message m). |
|||
|
||||
| Girin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 6.2.2008 Репутация: нет Всего: нет |
Собственно сделал, как вы советовали. То есть создал класс реализующий MessageListener интерфейс, переопределил в нем onMessage(). Создал поток, в методе run() которого инициализирую MQConnectionFactory , MQManager , MQQueue и соотвественно устанавливаю вызовом для MQSession.createConsumer(MyMessageListenerImpl) своего слушателя очереди Сообщения приходящие в очередь нормально обрабатываются, получаются и т.д. Но для постоянной связи с очередью необходимо чтобы тред, в котором устанавливается Consumer для очереди был перситентным, то есть постоянно в запущенном состоянии. Для этого я поставил в конце тела метода run() бесконечный цикл , это приводит к 100% загрузке процессора тредом. Есть ли еще какие то варианты реализации JMS Listener ? Заранее благодарен за помощь |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 4 Всего: 43 |
Для чего вы сделали бесконечный цикл? Если вы используете onMessage(Message m), то этот метод вызывается внешним потоком при получении нового сообщения. Бесконечный цикл здесь не нужен. Если же вы используете Message message = consumer.receive(..); , то, действительно, это надо делать в бесконечном цикле. Но метод receive(..) блокирующий, и поток ждет в методе, пока не придет сообщение. Поэтому 100% занятости cpu здесь не будет.
|
|||
|
||||
| Girin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 6.2.2008 Репутация: нет Всего: нет |
Можно поподробнее про внешний поток? После вызова регистрирующего метода MQSession.createConsumer(MyMessageListenerImpl) слушатель MyMessageListenerImpl(в котором переопределен onMessage()) функционирует до тех пор пока не завершиться поток, зарегистрировавший его. То есть сам по себе отдельно MyMessageListenerImpl не функционирует Это сообщение отредактировал(а) Girin - 23.12.2009, 09:44 |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 4 Всего: 43 |
А какое отношение может иметь к функционированию этого обьекта регистрирующий поток? Обьект MyMessageListenerImpl зарегистрирован, т.е. передана ссылка на него кому-то. У обьекта есть метод onMessage(Message message). Какой-то внешний поток должен вызывать этот метод и передавать в виде аргумента новое сообщение. По определению лисенера. Если у вас после завершения регистрации все умирает, то может вы используете локальные переменные для создаваемых обьектов и они просто становятся добычей gc ? |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |