Изучаем Java EE 7 - [207]

Шрифт
Интервал

• фильтрация сообщений — используя селекторы, вы можете фильтровать сообщения, которые хотите получать;

• настройка времени жизни сообщений — установите время окончания срока жизни сообщений так, что они не будут доставлены, если устарели;

• определение стойкости сообщения — укажите, что сообщения не пропадают в случае сбоя поставщика;

• управление подтверждением — задайте различные уровни подтверждения сообщений;

• создание стойких подписчиков — убедитесь, что сообщения доставлены недоступному абоненту в модели pub-sub;

• определение приоритетов — установите приоритет для доставки сообщений.

Фильтрация сообщений

Некоторые приложения для обмена сообщениями нуждаются в фильтрации получаемых сообщений. Когда сообщение рассылается множеству клиентов, полезно задать параметры так, что оно будет получено только определенными адресатами. Это снижает затраты времени и пропускной способности, которые поставщик в противном случае потратит зря, доставляя клиентам ненужные сообщения.

Вы видели, что сообщения состоят из трех частей: заголовка, свойств и тела (см. рис. 13.8). Заголовок содержит фиксированное количество полей (метаданные сообщения), а свойства представляют собой набор пользовательских пар «имя/значение», значения которых может устанавливать приложение. Выборка может выполняться по этим двум областям. Производители устанавливают одно или несколько значений свойств или полей заголовка, а потребитель указывает критерии отбора сообщений с использованием выражений-селекторов. Доставляются только сообщения, которые соответствуют селектору. Селекторы сообщений делегируют работу по фильтрации сообщений поставщику JMS, а не приложению.

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

>context.createConsumer(queue, "JMSPriority < 6"). receive();

>context.createConsumer(queue, "JMSPriority < 6 AND orderAmount < 200"). receive();

>context.createConsumer(queue, "orderAmount BETWEEN 1000 AND 2000"). receive();

В предыдущем фрагменте кода потребитель создается с помощью метода JMSContext.createConsumer(), получив в качестве параметра строку-селектор. Она может использовать поля заголовка (JMSPriority < 6) или пользовательские свойства (orderAmount < 200). Производитель устанавливает значения этих свойств сообщения следующим образом:

>context.createTextMessage(). setIntProperty("orderAmount", 1530);

>context.createTextMessage(). setJMSPriority(5);

Выражение селектора может использовать логические операторы (NOT, AND, OR), операторы сравнения (=, >, >=, <, <=, <>), арифметические операторы (+, -, *, /), выражения ([NOT] BETWEEN, [NOT] IN, [NOT] LIKE, IS [NOT] NULL) и т. д.

Настройка параметров времени существования сообщений

При большой нагрузке можно указать время существования сообщений, чтобы убедиться, что поставщик удалит их из места назначения по мере устаревания. Это делается либо с помощью API JMSProducer, либо путем установки поля заголовка JMSExpiration. JMSProducer включает в себя метод setTimeToLive(), который принимает количество миллисекунд:

>context.createProducer(). setTimeToLive(1000). send(queue, message);

Задание стойкости сообщения

JMS поддерживает два режима доставки сообщений: стойкую и нестойкую. Стойкая доставка гарантирует, что сообщение доставляется потребителю только один раз, в случае нестойкой сообщение может быть и не доставлено. Стойкая доставка (используемая по умолчанию) надежнее, но это стоит производительности, так как она предотвращает потери сообщения, если произошел сбой поставщика. Режим доставки можно указать с помощью метода setDeliveryMode() интерфейса JMSProducer:

>context.createProducer(). setDeliveryMode(DeliveryMode.NON_PERSISTENT). send(queue, message);

Управление подтверждением

До сих пор сценарии, которые мы рассматривали, предполагали, что сообщения отправляются и принимаются без подтверждения. Однако иногда вам может понадобиться, чтобы приемник подтверждал полученные сообщения (рис. 13.11). Фазу подтверждения может инициировать либо поставщик JMS, либо клиент, в зависимости от режима подтверждения.


Рис. 13.11. Потребитель подтверждает сообщение


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

• AUTO_ACKNOWLEDGE — сеанс автоматически подтверждает получение сообщения.

• CLIENT_ACKNOWLEDGE — клиент подтверждает сообщение явным вызовом метода Message.acknowledge().

• DUPS_OK_ACKNOWLEDGE — этот параметр указывает сеансу неспешно подтвердить доставку сообщения. Это может привести к многократной доставке некоторых сообщений, если происходит сбой поставщика JMS, поэтому его следует использовать потребителям, которые могут допускать дублирование сообщений. Если сообщение было доставлено повторно, поставщик устанавливает значение поля заголовка JMSRedelivered в true.

Следующий код использует аннотацию @JMSSessionMode для установки режима подтверждения JMSContext у производителя. Потребитель явно подтверждает сообщение, вызвав метод acknowledge():


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.