consumer = context.createSharedConsumer(topic, "SubName");
|
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
| Назад | Вперёд | Содержание |
В этом разделе описывается, как использовать JMS API для написания приложений, которые могут надёжно обрабатывать большие объёмы сообщений. В этих примерах используются как долговременные, так и не являющиеся таковыми, общие потребители.
Здесь рассматриваются следующие темы:
В этом разделе описываются принимающие клиенты на примере, который показывает, как использовать общего потребителя для рассылки сообщений, отправленных в тему, используемую несколькими потребителями. Затем в этом разделе объясняется, как скомпилировать и запустить клиенты с помощью GlassFish Server.
Возможно, вы захотите сравнить этот пример с результатами Запуска нескольких потребителей для одного пункта назначения с использованием общего пользователя. В этом примере сообщения распределяются среди потребителей в очереди, но каждый потребитель в теме получает все сообщения, потому что каждый потребитель в теме использует отдельную подписку на тему.
В этом примере, однако, сообщения распределяются между несколькими потребителями темы, потому что все потребители используют одну и ту же подписку. Каждое сообщение, добавленное в подписку на тему, принимается только одним потребителем, аналогично тому, как каждое сообщение, добавленное в очередь, принимается только одним потребителем.
Тема может иметь несколько подписок. Каждое сообщение, отправленное в тему, будет добавлено в каждую подписку. Однако, если в определённой подписке есть несколько потребителей, каждое сообщение, добавленное этой подписке, будет доставлено только одному из этих потребителей.
Отправляющий клиент — Producer.java — тот же клиент, который использовался в предыдущих примерах.
Получающим клиентом является SharedConsumer.java. Он очень похож на AsynchConsumer.java, за тем исключением, что он всегда использует тему. Он выполняет следующие шаги.
Инъецирует ресурсы для фабрики соединений и темы.
В блоке try-with-resources создаёт JMSContext.
Создаёт получателя для общей подписки, не являющейся долговременной, с указанием имени подписки:
consumer = context.createSharedConsumer(topic, "SubName");
Создаёт объект класса TextListener и регистрирует его в качестве слушателя сообщений для общего потребителя.
Слушает сообщения, опубликованные в пункте назначения, и завершает работу, когда пользователь вводит символ q или Q.
Ловит и обрабатывает все возможные исключения. Конец блока try-with-resources автоматически закрывает JMSContext.
Класс TextListener.java идентичен классу примера asynchconsumer.
В этом примере будет использоваться фабрика соединений по умолчанию и тема, которая была создана в Создание ресурсов для простых примеров.
Удостоверьтесь, чтобы GlassFish Server был запущен (см. Запуск и остановка сервера GlassFish).
Откройте три командных окна. Во-первых, перейдите в каталог simple/seller/:
cd tut-install/examples/jms/simple/producer/
Во втором и третьем окнах команд перейдите в каталог shared/sharedconsumer/:
cd tut-install/examples/jms/shared/sharedconsumer/
В одном из окон sharedconsumer соберите пример:
mvn install
В каждом из двух окон sharedconsumer запустите клиент. Не обязательно указывать аргумент topic:
appclient -client target/sharedconsumer.jar
Подождите, пока вы не увидите следующий вывод в обоих окнах:
Waiting for messages on topic
To end program, enter Q or q, then <return>
В окне producer запустите клиент, указав тему и количество сообщений:
appclient -client target/producer.jar topic 20
Каждый клиент потребителя получает некоторые из сообщений. Только один из клиентов получает нетекстовое сообщение, которое сигнализирует об окончании потока сообщений.
Введите Q или q и нажмите Return, чтобы остановить каждого клиента и просмотреть отчёт о количестве полученных текстовых сообщений.
Клиент shareddurableconsumer показывает, как использовать общие долговременные подписки. В нём показано, как общие долговременные подписки сочетают в себе преимущества долговременных подписок (подписка остается активной, если клиент не активен) с подписками общих потребителей (нагрузка по обработке сообщений может быть разделена между несколькими клиентами).
Этот пример намного больше похож на пример sharedconsumer, чем на клиент DurableConsumer.java. Он использует два класса, SharedDurableConsumer.java и TextListener.java, которые можно найти в каталоге tut-install/examples/jms/shared/shareddurableconsumer/.
Клиент использует java:comp/DefaultJMSConnectionFactory, фабрику соединений, у которой нет идентификатора клиента, как рекомендуется для общих долговременных подписок. Он использует метод createSharedDurableConsumer с именем подписки, чтобы установить подписку:
consumer = context.createSharedDurableConsumer(topic, "MakeItLast");
Вы запускаете пример в сочетании с клиентом Producer.java.
В окне терминала перейдите в следующий каталог:
tut-install/examples/jms/shared/shareddurableconsumer
Чтобы скомпилировать и упаковать клиент, введите следующую команду:
mvn install
Сначала запустите клиент, чтобы установить долговременную подписку:
appclient -client target/shareddurableconsumer.jar
Клиент отображает следующее и делает паузу:
Waiting for messages on topic
To end program, enter Q or q, then <return>
В окне shareddurableconsumer введите q или Q для выхода из программы. Подписка остается активной, хотя клиент не работает.
Откройте другое окно терминала и перейдите в каталог примера provider:
cd tut-install/examples/jms/simple/producer
Запустите пример producer, отправив несколько сообщений в тему:
appclient -client target/producer.jar topic 6
После того, как производитель отправил сообщения, откройте третье окно терминала и перейдите в каталог shareddurableconsumer.
Запустите клиент в первом и третьем окнах терминала. Клиент, запущенный первым, получит все сообщения, которые были отправлены, когда не было активного подписчика:
appclient -client target/shareddurableconsumer.jar
Пока оба клиента shareddurableconsumer работают, перейдите в окно provider и отправьте большее количество сообщений в тему:
appclient -client target/producer.jar topic 25
Теперь сообщения будут переданы обоим клиентам. Если продолжить отправлять группы сообщений в тему, каждый клиент получит некоторые из сообщений. Если выйти из одного из клиентов и отправить больше сообщений, другой клиент получит все сообщения.
| Назад | Вперёд | Содержание |
Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены.
Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)