Поделиться через


Руководство разработчика JMS 2.0 служебной шины Azure

В этом руководстве содержатся подробные сведения, помогающие успешно взаимодействовать с служебной шиной Azure с помощью API Java Message Service (JMS) 2.0.

Если вы не знакомы с служебной шиной Azure, ознакомьтесь со следующими статьями.

Начало работы Концепции

Модель программирования службы сообщений Java (JMS)

Модель программирования API службы сообщений Java, как показано в следующих разделах:

Примечание.

Уровень "Премиум" служебной шины Azure поддерживает JMS 1.1 и JMS 2.0.

Служебная шина Azure — уровень "Стандартный " поддерживает ограниченные функциональные возможности JMS 1.1. Дополнительные сведения см. в этой документации.

JMS — стандартные блоки

Приведенные ниже стандартные блоки доступны для взаимодействия с приложением JMS.

Примечание.

Приведенное ниже руководство было адаптировано из руководства по Oracle Java EE 6 для службы сообщений Java (JMS)

В этом руководстве рекомендуется лучше понять службу сообщений Java (JMS).

Фабрика подключений

Объект фабрики подключений используется клиентом для подключения к поставщику JMS. Фабрика подключений инкапсулирует набор параметров конфигурации подключения, определенных администратором.

Каждая фабрика подключений является экземпляром ConnectionFactoryили QueueConnectionFactoryTopicConnectionFactory интерфейсом.

Чтобы упростить подключение с служебной шиной Azure, эти интерфейсы реализуются с помощью ServiceBusJmsConnectionFactoryили ServiceBusJmsQueueConnectionFactoryServiceBusJmsTopicConnectionFactoryсоответственно.

Это важно

Приложения Java, использующие API JMS 2.0, могут подключаться к служебной шине Azure с помощью строки подключения или использовать TokenCredential для использования поддерживаемой проверки подлинности Microsoft Entra. При использовании поддерживаемой проверки подлинности Microsoft Entra назначьте роли и разрешения для удостоверения, как требуется.

Создайте системно назначаемую управляемую идентичность в Azure и используйте эту идентичность для создания TokenCredential.

TokenCredential tokenCredential = new DefaultAzureCredentialBuilder().build();

Затем фабрика подключений может быть создана с помощью приведенных ниже параметров.

  • Учетные данные токена — это учетные данные, способные предоставлять токен OAuth.
  • Узел — имя узла пространства имен уровня "Премиум" служебной шины Azure.
  • Контейнер свойств ServiceBusJmsConnectionFactorySettings, содержащий
    • connectionIdleTimeoutMS — время ожидания простоя подключения в миллисекундах.
    • traceFrames — логический флаг для сбора кадров трассировки AMQP для отладки.
    • другие параметры конфигурации

Фабрика может быть создана, как показано здесь. Учётные данные токена и узел являются обязательными параметрами, тогда как другие свойства необязательны.

String host = "<YourNamespaceName>.servicebus.windows.net";
ConnectionFactory factory = new ServiceBusJmsConnectionFactory(tokenCredential, host, null); 

Назначение JMS

Назначение — это объект, который клиент использует для указания целевого объекта сообщений, которые он создает, и источника потребляемых сообщений.

Назначения соответствуют сущностям в Azure Service Bus — очереди (в сценариях 'точка-точка') и топики (в сценариях pub-sub).

Связи

Соединение инкапсулирует виртуальное соединение с поставщиком услуг JMS. Служебная шина Azure представляет подключение с отслеживанием состояния между приложением и служебной шиной Azure через AMQP.

Подключение создается из фабрики соединений, как показано в следующем примере:

Connection connection = factory.createConnection();

Сеансы

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

Сеанс можно создать из объекта подключения, как показано в следующем примере:

Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

Примечание.

API JMS не поддерживает получение сообщений из очередей служебной шины или разделов с включенными сеансами обмена сообщениями.

Режимы сеанса

Сеанс можно создать с помощью любого из приведенных ниже режимов.

Режимы сеанса Поведение
Session.AUTO_ACKNOWLEDGE (автоматическое подтверждение сеанса) Сеанс автоматически подтверждает получение клиентом сообщения либо, когда сеанс успешно завершает вызов на получение, либо, когда прослушиватель сообщения, вызванный сеансом для обработки сообщения, успешно завершает выполнение.
Session.CLIENT_ACKNOWLEDGE Клиент признает потребляемое сообщение путем вызова метода подтверждения сообщения.
Session.DUPS_OK_ACKNOWLEDGE Этот режим подтверждения предписывает сеансу отложенно подтвердить доставку сообщений.
Session.SESSION_TRANSACTED Это значение может быть передано в качестве аргумента методу createSession(int sessionMode) в объекте Connection, чтобы указать, что сеанс должен использовать локальную транзакцию.

Если режим сеанса не указан, Session.AUTO_ACKNOWLEDGE выбирается по умолчанию.

JMSContext

Примечание.

JMSContext определяется как часть спецификации JMS 2.0.

JMSContext объединяет функциональные возможности, предоставляемые объектом подключения и сеанса. Его можно создать из объекта фабрики соединений.

JMSContext context = connectionFactory.createContext();

Режимы JMSContext

Как и объект Session , JMSContext можно создать с теми же режимами подтверждения, что и в режимах сеанса.

JMSContext context = connectionFactory.createContext(JMSContext.AUTO_ACKNOWLEDGE);

Если режим не указан, JMSContext.AUTO_ACKNOWLEDGE выбирается по умолчанию.

Производители сообщений JMS

Производитель сообщений — это объект, созданный с помощью JMSContext или сеанса, который используется для отправки сообщений в место назначения.

Его можно создать как автономный объект, как показано в следующем примере:

JMSProducer producer = context.createProducer();

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

context.createProducer().send(destination, message);

Потребители сообщений JMS

Потребитель сообщения — это объект, созданный JMSContext или сеансом, который используется для получения сообщений, отправленных в место назначения. Его можно создать, как показано в этом примере:

JMSConsumer consumer = context.createConsumer(dest);

Синхронные приемы через метод receive()

Потребитель сообщения предоставляет синхронный способ получения сообщений из назначения с помощью receive() метода.

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

Message m = consumer.receive();
Message m = consumer.receive(0);

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

Message m = consumer.receive(1000); // time out after one second.

Асинхронное получение сообщений с прослушивателями JMS

Прослушиватель сообщений — это объект, используемый для асинхронной обработки сообщений на конечном пункте. Он реализует MessageListener интерфейс, содержащий onMessage метод, в котором должна жить конкретная бизнес-логика.

Объект прослушивателя сообщений должен быть создан и зарегистрирован для конкретного потребителя сообщения с помощью setMessageListener метода.

Listener myListener = new Listener();
consumer.setMessageListener(myListener);

Потребление из тем

Потребители сообщений JMS создаются для назначения, который может быть очередью или разделом.

Потребители в очередях — это просто клиентские объекты, которые живут в контексте сеанса (и подключения) между клиентским приложением и служебной шиной Azure.

Несмотря на темы, потребители разделяются на 2 части -

  • Клиентский объект, который живет в контексте Session(или JMSContext) и
  • Подписка, которая является сущностью в Сервисной шине Azure.

Подписки описаны здесь и могут быть одними из следующих:

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

Браузеры очередей JMS

API JMS предоставляет QueueBrowser объект, позволяющий приложению просматривать сообщения в очереди и отображать значения заголовков для каждого сообщения.

Браузер очереди можно создать с помощью JMSContext, как показано в следующем примере:

QueueBrowser browser = context.createBrowser(queue);

Примечание.

API JMS не предоставляет API для просмотра раздела.

Это связано с тем, что сам раздел не сохраняет сообщения. Как только сообщение отправляется в раздел, оно перенаправляется в соответствующие подписки.

Селекторы сообщений JMS

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

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

  • Общая устойчивая подписка
  • Несоотделенные устойчивые подписки
  • Общая непостоянная подписка
  • Неразделяемая кратковременная подписка
  • Потребитель очереди
  • Браузер очередей

Примечание.

Селекторы Service Bus не поддерживают ключевые слова "LIKE" и "BETWEEN".

Сопоставление управления AMQP и операций шины служб

Вот как распоряжение AMQP преобразуется в операцию Service Bus:

ACCEPTED = 1; -> Complete()
REJECTED = 2; -> DeadLetter()
RELEASED = 3; (just unlock the message in service bus, will then get redelivered)
MODIFIED_FAILED = 4; -> Abandon() which increases delivery count
MODIFIED_FAILED_UNDELIVERABLE = 5; -> Defer()

Сводка

В этом руководстве разработчика показано, как клиентские приложения Java с помощью службы сообщений Java (JMS) могут подключаться к служебной шине Azure.

Дальнейшие действия

Дополнительные сведения о сущностях Службы сообщений Java (JMS) и служебной шине Azure см. в следующих статьях: