Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Warning
В этой статье рассматривается ограниченная поддержка API Java Message Service (JMS) 1.1 на уровне Standard службы Служебная шина Azure.
Для полной поддержки JMS 2.0 используйте Служебная шина Azure Premium уровня.
Используйте Apache Qpid JMS для отправки и получения сообщений через AMQP 1.0. В примерах используется Qpid напрямую; они не зависят от выведенной из эксплуатации библиотеки com.microsoft.azure:azure-servicebus или внутренних классов клиентской библиотеки Azure.
Начните работу с шиной сообщений
Создайте пространство имён служебная шина и очередь. Пример очереди использует очередь с именем BasicQueue.
Создайте политику совместного доступа с правами отправки и прослушивания. Настройте следующие переменные среды.
| Variable | Value |
|---|---|
SB_SAMPLES_NAMESPACE |
Хост пространства имён, например example.servicebus.windows.net. |
SB_SAMPLES_SAS_KEY_NAME |
Имя политики общего доступа. |
SB_SAMPLES_SAS_KEY |
Ключ политики совместного доступа. |
Держите ключи доступа вне системы контроля версий. Это отдельные значения, а не строка подключения служебная шина.
Скачайте клиентскую библиотеку AMQP 1.0 JMS
Установите JDK 11 или более позднюю версию и Maven, затем клонируйте репозиторий примеров служебная шина.
Пример очереди JMS включает её зависимости в pom.xml.
В примере используется javax.jms API с клиентом Qpid JMS 1.x. Для информации о версии Qpid и API см. документацию Apache Qpid JMS.
Программируйте приложения на Java
Интерфейс именования и каталогов Java
Java Naming and Directory Interface (JNDI) отделяет логические имена от физических адресов. Провайдер Qpid JNDI определяет фабрику соединений и очередь из свойств конфигурации.
Настройте контекст JNDI и настройте объект ConnectionFactory
Следующий код использует узел пространства имен и учетные данные политики, настроенные ранее:
import javax.jms.ConnectionFactory;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Hashtable;
String namespaceHost = System.getenv("SB_SAMPLES_NAMESPACE");
String sasKeyName = System.getenv("SB_SAMPLES_SAS_KEY_NAME");
String sasKey = System.getenv("SB_SAMPLES_SAS_KEY");
if (namespaceHost == null || namespaceHost.isEmpty()
|| sasKeyName == null || sasKeyName.isEmpty()
|| sasKey == null || sasKey.isEmpty()) {
throw new IllegalArgumentException("Set the namespace host, policy name, and policy key.");
}
Hashtable<String, String> properties = new Hashtable<>();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.qpid.jms.jndi.JmsInitialContextFactory");
properties.put("connectionfactory.SBCF",
"amqps://" + namespaceHost + "?amqp.idleTimeout=120000");
properties.put("queue.QUEUE", "BasicQueue");
Context context = new InitialContext(properties);
ConnectionFactory factory = (ConnectionFactory) context.lookup("SBCF");
Destination queue = (Destination) context.lookup("QUEUE");
Настройка очередей назначения производителя и потребителя
Создайте JMS-соединение, используя имя политики и ключ. Используйте очередь, разрешённую через JNDI, в качестве назначения, вместо того чтобы приводить строку имени очереди к типу Destination.
Connection connection = factory.createConnection(sasKeyName, sasKey);
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(queue);
Создайте отдельную сессию для потребителя. Начните его соединение до получения сообщений.
Простое приложение JMS, использующее очередь служебная шина
Быстрый старт очереди JMS содержит полное приложение, включая отправку сообщений, их получение и подтверждение, а также закрытие ресурсов JMS.
Запуск приложения
Из каталога samples/Java/qpid-jms-client/JmsQueueQuickstart соберите пример. Тест интеграции также использует настроенное пространство имён и очередь.
mvn clean package
Запустите упакованное приложение:
java -jar target/jmsqueuequickstart-1.0.0-jar-with-dependencies.jar
Приложение отправляет десять сообщений, принимает и подтверждает их, после чего выходит из системы. Для компиляции и упаковки без запуска интеграционного теста используйте mvn -DskipTests package.
Сопоставление управления AMQP и операций шины служб
Вот как распоряжение AMQP преобразуется в операцию служебная шина:
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()
Топики JMS и топики служебная шина
Использование тем и подписок служебная шина через JMS API обеспечивает базовые возможности отправки и приёма. Это удобный выбор, когда вы портируете приложения с других брокеров сообщений с API, совместимыми с JMS, хотя разделы служебная шина отличаются от разделов JMS и требуют некоторых корректировок.
Темы служебная шина направляют сообщения в именные, общие и постоянные подписки, которые управляются через интерфейс управления ресурсами Azure, инструменты командной строки Azure или портал Azure. Каждая подписка позволяет использовать до 2000 правил выбора, каждое из которых может иметь условие фильтра, а для SQL-фильтров — также действие преобразования метаданных. Каждое совпадение с условием фильтра выбирает входящее сообщение для копирования в подписку.
Получение сообщений от подписок идентично получению сообщений из очередей. Каждая подписка имеет связанную очередь недоставленных сообщений и возможность автоматически пересылать сообщения в другую очередь или топики.
Темы JMS позволяют клиентам динамически создавать недолговечных и постоянных подписчиков, которые по желанию позволяют фильтровать сообщения с помощью селекторов сообщений. Эти несовместно используемые сущности не поддерживаются стандартом служебная шина. Синтаксис правил SQL-фильтра для служебная шина похож на синтаксис селектора сообщений, поддерживаемый JMS.
Сторона издателя темы JMS совместима со стандартом служебная шина, как показано в примере темы JMS, но динамические подписчики — нет.
Неподдерживаемые функции и ограничения
Следующие ограничения применяются к JMS по AMQP 1.0 с стандартом служебная шина:
- В одной сессии разрешен только один объект MessageProducer или MessageConsumer. Если вам нужно несколько производителей или потребителей, создайте отдельную сессию для каждого.
- Подписки на изменяемые темы не поддерживаются.
- Объекты MessageSelector не поддерживаются.
- Распределённые транзакции не поддерживаются, но транзакционные сессии поддерживаются.
служебная шина Standard разделяет управляющую плоскость от плоскости данных, поэтому не поддерживает несколько функций динамической топологии JMS.
| Неподдерживаемый метод | Заменить на |
|---|---|
| createDurableSubscriber | Создайте подписку на тему, которая поддерживает селектор сообщений. |
| createDurableConsumer | Создайте подписку на тему с селектором сообщений. |
| createSharedConsumer | Темы служебная шина всегда доступны для общего доступа. См. темы JMS против темы служебная шина. |
| createSharedDurableConsumer | Темы служебная шина всегда доступны для совместного использования. См. темы JMS против темы служебная шина. |
| создатьВременнуюТему | Создайте тему через API управления, инструменты или портал, если для AutoDeleteOnIdle задан период истечения. |
| createTopic | Создайте тему через API управления, инструменты или портал. |
| Отписаться | Удалите тему через API управления, инструменты или портал. |
| createBrowser | Используйте функционал Peek клиентской библиотеки служебная шина. |
| createQueue | Создайте очередь через API управления, инструменты или портал. |
| createTemporaryQueue | Создайте очередь через API управления, инструменты или портал с параметром AutoDeleteOnIdle, установленным на период бездействия. |
| receiveNoWait | Используйте операцию приема с коротким тайм-аутом. |