Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Высокопроизводительные и масштабируемые приложений JMS

В этом разделе описывается, как использовать JMS API для написания приложений, которые могут надёжно обрабатывать большие объёмы сообщений. В этих примерах используются как долговременные, так и не являющиеся таковыми, общие потребители.

Здесь рассматриваются следующие темы:

Использование общих подписок, не являющихся долговременными

В этом разделе описываются принимающие клиенты на примере, который показывает, как использовать общего потребителя для рассылки сообщений, отправленных в тему, используемую несколькими потребителями. Затем в этом разделе объясняется, как скомпилировать и запустить клиенты с помощью GlassFish Server.

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

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

Тема может иметь несколько подписок. Каждое сообщение, отправленное в тему, будет добавлено в каждую подписку. Однако, если в определённой подписке есть несколько потребителей, каждое сообщение, добавленное этой подписке, будет доставлено только одному из этих потребителей.

Написание клиентов для примера общего потребителя

Отправляющий клиент — Producer.java — тот же клиент, который использовался в предыдущих примерах.

Получающим клиентом является SharedConsumer.java. Он очень похож на AsynchConsumer.java, за тем исключением, что он всегда использует тему. Он выполняет следующие шаги.

  1. Инъецирует ресурсы для фабрики соединений и темы.

  2. В блоке try-with-resources создаёт JMSContext.

  3. Создаёт получателя для общей подписки, не являющейся долговременной, с указанием имени подписки:

    consumer = context.createSharedConsumer(topic, "SubName");
  4. Создаёт объект класса TextListener и регистрирует его в качестве слушателя сообщений для общего потребителя.

  5. Слушает сообщения, опубликованные в пункте назначения, и завершает работу, когда пользователь вводит символ q или Q.

  6. Ловит и обрабатывает все возможные исключения. Конец блока try-with-resources автоматически закрывает JMSContext.

Класс TextListener.java идентичен классу примера asynchconsumer.

В этом примере будет использоваться фабрика соединений по умолчанию и тема, которая была создана в Создание ресурсов для простых примеров.

Запуск клиентов SharedConsumer и Producer

  1. Удостоверьтесь, чтобы GlassFish Server был запущен (см. Запуск и остановка сервера GlassFish).

  2. Откройте три командных окна. Во-первых, перейдите в каталог simple/seller/:

    cd tut-install/examples/jms/simple/producer/
  3. Во втором и третьем окнах команд перейдите в каталог shared/sharedconsumer/:

    cd tut-install/examples/jms/shared/sharedconsumer/
  4. В одном из окон sharedconsumer соберите пример:

    mvn install
  5. В каждом из двух окон sharedconsumer запустите клиент. Не обязательно указывать аргумент topic:

    appclient -client target/sharedconsumer.jar

    Подождите, пока вы не увидите следующий вывод в обоих окнах:

    Waiting for messages on topic
    To end program, enter Q or q, then <return>
  6. В окне producer запустите клиент, указав тему и количество сообщений:

    appclient -client target/producer.jar topic 20

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

  7. Введите 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.

Запуск клиентов SharedDurableConsumer и Producer

  1. В окне терминала перейдите в следующий каталог:

    tut-install/examples/jms/shared/shareddurableconsumer
  2. Чтобы скомпилировать и упаковать клиент, введите следующую команду:

    mvn install
  3. Сначала запустите клиент, чтобы установить долговременную подписку:

    appclient -client target/shareddurableconsumer.jar
  4. Клиент отображает следующее и делает паузу:

    Waiting for messages on topic
    To end program, enter Q or q, then <return>
  5. В окне shareddurableconsumer введите q или Q для выхода из программы. Подписка остается активной, хотя клиент не работает.

  6. Откройте другое окно терминала и перейдите в каталог примера provider:

    cd tut-install/examples/jms/simple/producer
  7. Запустите пример producer, отправив несколько сообщений в тему:

    appclient -client target/producer.jar topic 6
  8. После того, как производитель отправил сообщения, откройте третье окно терминала и перейдите в каталог shareddurableconsumer.

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

    appclient -client target/shareddurableconsumer.jar
  10. Пока оба клиента shareddurableconsumer работают, перейдите в окно provider и отправьте большее количество сообщений в тему:

    appclient -client target/producer.jar topic 25

    Теперь сообщения будут переданы обоим клиентам. Если продолжить отправлять группы сообщений в тему, каждый клиент получит некоторые из сообщений. Если выйти из одного из клиентов и отправить больше сообщений, другой клиент получит все сообщения.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)