Перенос существующих приложений Java Message Service (JMS) 2.0 с Apache ActiveMQ на служебную шину Azure.

В этой статье обсуждается, как модифицировать существующее приложение Java Message Service (JMS) 2.0, которое взаимодействует с брокером JMS для взаимодействия со служебной шиной Azure. В частности, в статье рассматривается перенос с Apache ActiveMQ или Amazon MQ.

Шина Azure Service Bus поддерживает Java 2 Platform, Enterprise Edition и Spring, которые используют JMS 2.0 API поверх Advanced Message Queueing Protocol (AMQP).

Перед началом работы

Различия между служебной шиной Azure и Apache ActiveMQ

Служебная шина Azure и Apache ActiveMQ — это брокеры сообщений, которые действуют как поставщики JMS для клиентских приложений при отправке и получения сообщений. Они включают семантику "точка-точка" с очередями и семантику публикации и подписки с разделами и подписками.

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

Категория ActiveMQ Служебная шина Azure
Распределение по уровням приложений Кластеризованный монолит Двухуровневый
(шлюз + серверная часть)
Поддержка протоколов
  • AMQP
  • ТОПАТЬ
  • OpenWire
AMQP
Режим подготовки
  • Инфраструктура как услуга (IaaS), локальная среда
  • Amazon MQ (управляемая платформа как услуга)
Управляемая платформа как услуга (PaaS)
Размер сообщения Настраиваемый пользователем 100 МБ (уровень "Премиум")
Высокая доступность Управляемые клиентом Управляемые платформой
Аварийное восстановление Управляемые клиентом Управляемые платформой

Поддерживаемые и неподдерживаемые функции в настоящее время

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

Компонент API Состояние
Очереди
  • JMSContext.createQueue(String queueName)
Поддерживается
Темы
  • JMSContext.createTopic(String topicName)
Поддерживается
Временные очереди
  • JMSContext.createTemporaryQueue()
Поддерживается
Временные разделы
  • JMSContext.createTemporaryTopic()
Поддерживается
Создатель сообщений /
JMSProducer
  • JMSContext.createProducer()
Поддерживается
Браузеры очередей
  • JMSContext.createBrowser(очередь очереди)
  • JMSContext.createBrowser(Очередь, Строка messageSelector)
Поддерживается
Потребитель сообщения/
JMSConsumer
  • JMSContext.createConsumer(назначение назначения)
  • JMSContext.createConsumer(назначение назначения, string messageSelector)
  • JMSContext.createConsumer( Destination destination, строка messageSelector, логическая величина noLocal)

noLocal в настоящее время не поддерживается
Поддерживается
общие устойчивые подписки;
  • JMSContext.createSharedDurableConsumer(Тема, имя строки)
  • JMSContext.createSharedDurableConsumer(Тема, имя строки, строковое сообщениеSelector)
Поддерживается
Устойчивые подписки без общего доступа
  • JMSContext.createDurableConsumer(тема раздела, имя строки)
  • createDurableConsumer(Topic topic, String name, String messageSelector, boolean noLocal)

noLocal в настоящее время не поддерживается, для этой величины следует задать значение "false"
Поддерживается
общие неустойчивые подписки;
  • JMSContext.createSharedConsumer(Раздел, String sharedSubscriptionName)
  • JMSContext.createSharedConsumer(Раздел, String sharedSubscriptionName, String messageSelector)
Поддерживается
Необщие неустойчивые подписки
  • JMSContext.createConsumer(назначение назначения)
  • JMSContext.createConsumer(назначение назначения, string messageSelector)
  • JMSContext.createConsumer( назначение назначения, String messageSelector, boolean noLocal)

noLocal в настоящее время не поддерживается, для этой величины следует задать значение "false"
Поддерживается
Селекторы сообщений зависит от созданного получателя Поддерживается
Delivery Delay (запланированные сообщения)
  • JMSProducer.setDeliveryDelay(long deliveryDelay)
Поддерживается
Создание сообщения
  • JMSContext.createMessage()
  • JMSContext.createBytesMessage()
  • JMSContext.createMapMessage()
  • JMSContext.createObjectMessage(Serializable object)
  • JMSContext.createStreamMessage()
  • JMSContext.createTextMessage()
  • JMSContext.createTextMessage(String text)
Поддерживается
Транзакции между объектами
  • Подключение ion.createSession(true, Session.SESSION_TRANSACTED)
Поддерживается
Распределенные транзакции Не поддерживается

Рекомендации

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

Обновления службы

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

Перенос данных

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

Аутентификация и авторизация

Управление доступом на основе ролей Azure (Azure RBAC), поддерживаемая идентификатором Microsoft Entra ID, является предпочтительным механизмом проверки подлинности для служебная шина. Чтобы включить управление доступом на основе ролей, выполните действия, описанные в руководстве разработчика Служебная шина Azure JMS 2.0.

Подготовка к миграции

Проверка версии

При написании приложений JMS используются следующие компоненты и версии:

Компонент Версия
Java Message Service (JMS) API версия 1.1 или выше.
Протокол AMQP 1.0

Убедитесь, что порты AMQP открыты.

Служебная шина поддерживает обмен данными по протоколу AMQP. Для этой цели необходимо разрешить обмен данными через порты 5671 (AMQP) и 443 (TCP). В зависимости от того, где размещаются клиентские приложения, может потребоваться обращение в службу поддержки, чтобы разрешить обмен данными через эти порты.

Важно!

Служебная шина поддерживает только протокол AMQP 1.0.

Настройка корпоративных конфигураций

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

Мониторинг, оповещения и трассировка

Для каждого пространства имен служебной шины публикуются метрики на Azure Monitor. Эти метрики можно использовать для оповещения и динамического масштабирования ресурсов, выделенных пространству имен.

Дополнительные сведения о различных метриках и о настройке оповещений см. в разделе Метрики служебной шины в Azure Monitor. Кроме того, вы можете получить дополнительные сведения о трассировке на стороне клиента для операций с данными, а также оперативном и диагностическом ведении журнала для операций управления.

Метрики — New Relic

Вы можете сопоставить метрики из ActiveMQ Map с метриками в служебной шине Azure. См. следующие сведения с веб-сайта New Relic:

Примечание.

Сейчас у New Relic нет прямой, простой интеграции с ActiveMQ, но есть метрики, доступные для Amazon MQ. Поскольку Amazon MQ является производным от ActiveMQ, в следующей таблице сопоставлены метрики New Relic из Amazon MQ в служебную шину Azure.

Группирование метрик Метрика Amazon MQ/ActiveMQ Метрика служебной шины Azure
Broker CpuUtilization CPUXNS
Broker MemoryUsage WSXNS
Broker CurrentConnectionsCount activeConnections
Broker EstablishedConnectionsCount activeConnections + connectionsClosed
Broker InactiveDurableTopicSubscribersCount Использование метрик подписки
Broker TotalMessageCount Используйте уровень очереди/темы/подписки activeMessages
Очередь/Раздел EnqueueCount incomingMessages
Очередь/Раздел DequeueCount outgoingMessages
Очередь QueueSize sizeBytes

Миграция

Чтобы перенести существующее приложение JMS 2.0 для взаимодействия со служебной шиной Microsoft Azure, выполните действия, описанные в следующих разделах.

Экспорт топологии из ActiveMQ и создание сущностей в служебной шине Microsoft Azure (необязательно)

Чтобы обеспечить возможность беспрепятственного подключения клиентских приложений к служебной шине Microsoft Azure, перенесите топологию (включая очереди, разделы и подписки) из Apache ActiveMQ в служебную шину.

Примечание.

Для приложений JMS в качестве операции времени выполнения создаются очереди, разделы и подписки. Большинство поставщиков JMS (брокеров сообщений) дают возможность создавать их во время выполнения. Вот почему этот шаг экспорта считается необязательным. Чтобы убедиться, что приложение имеет разрешения на создание топологии во время выполнения, используйте строку подключения с разрешениями SAS Manage.

Для этого необходимо сделать следующее.

  1. Чтобы экспортировать топологию, используйте программы командной строки ActiveMQ.
  2. Повторно создайте ту же топологию с помощью шаблона Azure Resource Manager.
  3. Выполните шаблон Azure Resource Manager.

Импорт зависимости maven для реализации JMS служебной шины Microsoft Azure

Чтобы обеспечить бесперебойное подключение к служебной шине Microsoft Azure, добавьте пакет azure-servicebus-jms в качестве зависимости в файл pom.xml Maven следующим образом:

<dependencies>
...
    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-servicebus-jms</artifactId>
    </dependency>
...
</dependencies>

Изменения конфигурация сервера приложений

Эта часть настроена для сервера приложений, на котором размещены клиентские приложения, подключающиеся к ActiveMQ.

Приложения Spring

Обновите файл application.properties.

Если вы используете приложение Spring Boot для подключения к ActiveMQ, необходимо удалить свойства, относящиеся к ActiveMQ, из файла application.properties.

spring.activemq.broker-url=<ACTIVEMQ BROKER URL>
spring.activemq.user=<ACTIVEMQ USERNAME>
spring.activemq.password=<ACTIVEMQ PASSWORD>

Затем добавьте в файл application.properties свойства, относящиеся к служебной шине Microsoft Azure.

azure.servicebus.connection-string=Endpoint=myEndpoint;SharedAccessKeyName=mySharedAccessKeyName;SharedAccessKey=mySharedAccessKey
Замените ActiveMQConnectionFactory на ServiceBusJmsConnectionFactory.

Следующим шагом является замена экземпляра ActiveMQConnectionFactory на ServiceBusJmsConnectionFactory.

Примечание.

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

Ранее можно было создать экземпляр объекта ActiveMQConnectionFactory, как показано ниже.


String BROKER_URL = "<URL of the hosted ActiveMQ broker>";
ConnectionFactory factory = new ActiveMQConnectionFactory(BROKER_URL);

Connection connection = factory.createConnection();
connection.start();

Теперь изменим его для создания экземпляра объекта ServiceBusJmsConnectionFactory, как показано ниже.


ServiceBusJmsConnectionFactorySettings settings = new ServiceBusJmsConnectionFactorySettings();
String SERVICE_BUS_CONNECTION_STRING = "<Service Bus Connection string>";

ConnectionFactory factory = new ServiceBusJmsConnectionFactory(SERVICE_BUS_CONNECTION_STRING, settings);

Connection connection = factory.createConnection();
connection.start();

После миграции

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

Следующие шаги

Используйте Spring Boot Starter для Azure Service Bus JMS, чтобы обеспечить безукоризненную интеграцию со служебной шиной.

Дополнительные сведения об обмене сообщениями через служебную шину Microsoft Azure и JMS см. в следующих статьях: