Как я могу уведомить экземпляр сервера cometd, когда я получаю сообщение JMS в bean-компоненте, управляемом сообщениями?

Я где-то читал, что Cometd специфичен для контейнера, и мы не можем внедрить его в контейнер EJB. У меня есть приложение, в котором определены MDB, и полученные сообщения каким-то образом должны быть отправлены веб-клиентам. Является ли это возможным?

Я ценю любые материалы. Спасибо.


person Ram C    schedule 05.03.2014    source источник


Ответы (1)


CometD не зависит от контейнера, он будет работать в любом контейнере Servlet 3, использующем асинхронные сервлеты.

CometD использует классы Jetty для своей реализации и лучше всего масштабируется при развертывании в Jetty, но есть пользователи, которые развертывают CometD в Томкэт, Глассфиш и т.д.

Сказав это, если вы развернете CometD на сервере JEE и у вас есть MDB, вы можете легко преобразовать сообщение MDB в сообщение CometD и отправить его клиентам.

Фактические детали того, как связать MDB с CometD, зависят от используемых вами фреймворков (например, Spring, CDI, custom и т. д.), но обычно MDB необходимо искать/уведомлять службу CometD, а служба CometD транслирует CometD. сообщение.

Вы можете найти руководство по серверной части CometD, очень похожее (хотя и не использующее MDB) на то, что вам нужно. . В этом руководстве роль MDB играет класс StockPriceEmitter.

Дополнительную информацию см. также в справочном руководстве по CometD.

person sbordet    schedule 05.03.2014
comment
Я должен улучшить свой вопрос. Когда я говорю о конкретном контейнере, я имею в виду, что мы не можем внедрить экземпляр сервера Bayeux в контейнер EJB. Cometd работает только на сервлетном движке, который поддерживает асинхронные каналы. Да, эмиттер цен на акции похож на MDB. В случае MDB, который работает в контейнере EJB, как мне искать или уведомлять. Насколько я знаю Java EE, я думаю, что единственный способ уведомить — это вызывать сервлет каждый раз, когда он получает сообщение JMS. Пожалуйста, поправьте меня, если я ошибаюсь. Спасибо за быстрый ответ. - person Ram C; 06.03.2014
comment
CometD 2.x работает в любом контейнере сервлетов, даже совместимом только с Servlet 2.5. Он будет намного менее масштабируемым из-за блокирующего характера этих контейнеров, за исключением Jetty 7, который является контейнером, совместимым с Servlet 2.5, но допускает асинхронные функции. - person sbordet; 06.03.2014
comment
Способ поиска других компонентов в MDB зависит от того, что вы на самом деле используете. Например, Spring позволяет вам внедрять зависимости в MDB, и поэтому вы можете внедрять сервис CometD. В качестве альтернативы вы можете использовать шаблоны Singleton или ServiceLocator или, возможно, даже события CDI. - person sbordet; 06.03.2014
comment
Если вы хотите улучшить интеграцию CometD с компонентами JEE, отправьте сообщение о проблеме в системе отслеживания проблем CometD. - person sbordet; 06.03.2014
comment
Ничего себе, если бы я мог внедрить сервис CometD в MDB, это было бы здорово. Не могли бы вы указать какой-нибудь документ или учебник, который внедряет сервис CometD в MDB? Большое спасибо за подробные ответы и ваше время. :-) - person Ram C; 06.03.2014
comment
Вы не сказали, что вы используете, будь то Spring, простой JEE, CDI или что-то еще. Google - ваш друг, чтобы найти инструкции о том, как внедрять вещи в MDB. Как я уже сказал, поддержка CometD определенно может быть улучшена в этой области. Я постараюсь найти время, чтобы написать учебник по CometD - CDI. - person sbordet; 07.03.2014
comment
Извиняюсь. Я использую простой JEE, Websphere 8.5/Jboss 7.1. Я попытался развернуть пример приложения cometd на этих механизмах сервлетов, и он работает. Я использую потоки Commonj в контейнере сервлета для прослушивания сообщений JM, а затем использую службу CometD для обратного маршрута к веб-клиентам. В этом сценарии мне придется управлять всеми соединениями JMS. Я подумал, что будет лучшим решением, если я буду использовать MDB вместо потоков. Мне не терпится увидеть ваш туториал по CometD. Спасибо. - person Ram C; 07.03.2014
comment
вы правы, я думаю, что события CDI помогают здесь наблюдать за событиями, запускаемыми MDB на веб-уровне. Я попробую этот метод. Спасибо. - person Ram C; 09.03.2014