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
Теперь сообщения будут переданы обоим клиентам. Если продолжить отправлять группы сообщений в тему, каждый клиент получит некоторые из сообщений. Если выйти из одного из клиентов и отправить больше сообщений, другой клиент получит все сообщения.
Назад | Вперёд | Содержание |