Migrieren vorhandener JMS 2.0-Anwendungen (Java Message Service) von Apache ActiveMQ zu Azure Service Bus

In diesem Artikel wird erläutert, wie eine vorhandene JMS 2.0-Anwendung (Java Message Service), die mit einem JMS-Broker interagiert, so geändert wird, dass sie stattdessen mit Azure Service Bus interagiert. Insbesondere wird im Artikel die Migration von Apache ActiveMQ oder Amazon MQ behandelt.

Azure Service Bus unterstützt Java 2-, Enterprise Edition- und Spring-Workloads, die die JMS 2.0-API über AMQP (Advanced Message Queueing Protocol) nutzen.

Vorbereitung

Unterschiede zwischen Azure Service Bus und Apache ActiveMQ

Sowohl Azure Service Bus als auch Apache ActiveMQ sind Nachrichtenbroker, die als JMS-Anbieter fungieren, sodass Clientanwendungen Nachrichten senden und empfangen können. Beide ermöglichen Punkt-zu-Punkt-Semantik mit Warteschlangen und Veröffentlichen-Abonnieren-Semantik mit Themen und Abonnements.

Dennoch gibt es einige Unterschiede zwischen den beiden Nachrichtenbrokern, wie in der folgenden Tabelle zu sehen ist:

Category ActiveMQ Azure Service Bus
Anwendungstiering Gruppiert monolithisch Zweistufig
(Gateway und Back-End)
Protokollunterstützung
  • AMQP
  • STOMP
  • OpenWire
AMQP
Bereitstellungsmodus
  • Infrastructure-as-a-Service (IaaS), lokal
  • Amazon MQ (verwaltete Platform as a Service)
Verwaltete Platform as a Service (PaaS)
Nachrichtengröße Vom Benutzer konfigurierbar 100 MB (Premium-Tarif)
Hochverfügbarkeit Vom Kunden verwaltet Von der Plattform verwaltet
Notfallwiederherstellung Vom Kunden verwaltet Von der Plattform verwaltet

Zurzeit unterstützte und nicht unterstützte Funktionen

In der folgenden Tabelle sind die zurzeit von Azure Service Bus unterstützten JMS-Funktionen (Java Message Service) aufgelistet. Außerdem werden Funktionen angezeigt, die nicht unterstützt werden.

Funktion API Status
Warteschlangen
  • JMSContext.createQueue( String queueName)
Unterstützt
Themen
  • JMSContext.createTopic( String topicName)
Unterstützt
Temporäre Warteschlangen
  • JMSContext.createTemporaryQueue()
Unterstützt
Temporäre Themen
  • JMSContext.createTemporaryTopic()
Unterstützt
Message Producer /
JMSProducer
  • JMSContext.createProducer()
Unterstützt
Warteschlangenbrowser
  • JMSContext.createBrowser(Queue queue)
  • JMSContext.createBrowser(Queue queue, String messageSelector)
Unterstützt
Message Consumer/
JMSConsumer
  • JMSContext.createConsumer( Destination destination)
  • JMSContext.createConsumer( Destination destination, String messageSelector)
  • JMSContext.createConsumer( Destination destination, String messageSelector, boolean noLocal)

„noLocal“ wird zurzeit nicht unterstützt.
Unterstützt
Freigegebene dauerhafte Abonnements
  • JMSContext.createSharedDurableConsumer(Topic topic, String name)
  • JMSContext.createSharedDurableConsumer(Topic topic, String name, String messageSelector)
Unterstützt
Nicht freigegebene dauerhafte Abonnements
  • JMSContext.createDurableConsumer(Topic topic, String name)
  • createDurableConsumer(Topic topic, String name, String messageSelector, boolean noLocal)

„noLocal“ wird zurzeit nicht unterstützt und sollte auf „false“ festgelegt werden.
Unterstützt
Freigegebene nicht dauerhafte Abonnements
  • JMSContext.createSharedConsumer(Topic topic, String sharedSubscriptionName)
  • JMSContext.createSharedConsumer(Topic topic, String sharedSubscriptionName, String messageSelector)
Unterstützt
Nicht freigegebene nicht dauerhafte Abonnements
  • JMSContext.createConsumer(Destination destination)
  • JMSContext.createConsumer( Destination destination, String messageSelector)
  • JMSContext.createConsumer( Destination destination, String messageSelector, boolean noLocal)

„noLocal“ wird zurzeit nicht unterstützt und sollte auf „false“ festgelegt werden.
Unterstützt
Nachrichtenselektoren Abhängig vom erstellten Consumer. Unterstützt
Tägliche Zustellung (geplante Nachrichten)
  • JMSProducer.setDeliveryDelay( long deliveryDelay)
Unterstützt
Nachricht erstellt
  • JMSContext.createMessage()
  • JMSContext.createBytesMessage()
  • JMSContext.createMapMessage()
  • JMSContext.createObjectMessage( Serializable object)
  • JMSContext.createStreamMessage()
  • JMSContext.createTextMessage()
  • JMSContext.createTextMessage( String text)
Unterstützt
Entitätsübergreifende Transaktionen
  • Connection.createSession(true, Session.SESSION_TRANSACTED)
Unterstützt
Verteilte Transaktionen Nicht unterstützt

Überlegungen

Die zweistufige Natur von Azure Service Bus bietet verschiedene Funktionen für Geschäftskontinuität (Hochverfügbarkeit und Notfallwiederherstellung). Bei der Verwendung von JMS-Features gibt es jedoch einige Überlegungen zu beachten.

Dienstupgrades

Bei Service Bus-Upgrades und -Neustarts werden temporäre Warteschlangen und Themen gelöscht. Wenn Ihre Anwendung gegenüber dem Verlust von Daten in temporären Warteschlangen oder Themen empfindlich ist, verwenden Sie keine temporären Warteschlangen oder Themen. Verwenden Sie stattdessen dauerhafte Warteschlangen, Themen und Abonnements.

Datenmigration

Im Rahmen der Migration und Änderung von Clientanwendungen für die Interaktion mit Azure Service Bus werden die in ActiveMQ gespeicherten Daten nicht zu Service Bus migriert. Möglicherweise benötigen Sie eine benutzerdefinierte Anwendung, die ActiveMQ-Warteschlangen, -Themen und -Abonnements entfernt und die Nachrichten in Warteschlangen, Themen und Abonnements von Service Bus erneut wiedergibt.

Authentifizierung und Autorisierung

Die von Microsoft Entra ID unterstützte rollenbasierte Zugriffssteuerung in Azure (Role Based Access Control, RBAC) ist der bevorzugte Authentifizierungsmechanismus für Service Bus. Führen Sie zum Aktivieren der rollenbasierten Zugriffssteuerung die Schritte im Entwicklerleitfaden für Azure Service Bus JMS 2.0 aus.

Vor der Migration

Versionsüberprüfung

Beim Schreiben der JMS-Anwendungen verwenden Sie die folgenden Komponenten und Versionen:

Komponente Version
JMS-API (Java Message Service) 1.1 oder höher
AMQP-Protokoll 1.0

Stellen Sie sicher, dass AMQP-Ports geöffnet sind.

Service Bus unterstützt die Kommunikation über das AMQP-Protokoll. Aktivieren Sie zu diesem Zweck die Kommunikation über die Ports 5671 (AMQP) und 443 (TCP). Abhängig davon, wo die Clientanwendungen gehostet werden, benötigen Sie möglicherweise ein Supportticket, um die Kommunikation über diese Ports zuzulassen.

Wichtig

Service Bus unterstützt nur das AMQP 1.0-Protokoll.

Einrichten von Unternehmenskonfigurationen

Service Bus bietet verschiedene Features für Unternehmenssicherheit und Hochverfügbarkeit. Weitere Informationen finden Sie unter

Überwachung, Warnungen und Ablaufverfolgung

Für jeden Service Bus-Namespace veröffentlichen Sie Metriken in Azure Monitor. Sie können diese Metriken für Warnungen und die dynamische Skalierung von Ressourcen verwenden, die dem Namespace zugeordnet sind.

Weitere Informationen zu den verschiedenen Metriken und zum Einrichten von Warnungen für diese finden Sie unter Service Bus-Metriken in Azure Monitor. Sie finden auch zu clientseitiger Ablaufverfolgung für Datenvorgänge und Betriebs-/Diagnoseprotokollierung für Verwaltungsvorgänge weitere Informationen.

Metriken – New Relic

Sie können die Metriken von ActiveMQ Metriken in Azure Service Bus zuordnen. Weitere Informationen finden Sie in den folgenden Artikeln auf der New Relic-Website:

Hinweis

Derzeit verfügt New Relic nicht über direkte nahtlose Integration mit ActiveMQ, es sind jedoch Metriken für Amazon MQ verfügbar. Da Amazon MQ von ActiveMQ abgeleitet ist, ordnet die nachstehende Tabelle die New Relic-Metriken von Amazon MQ Azure Service Bus zu.

Metrikgruppierung Metrik für Amazon MQ/ActiveMQ Azure Service Bus-Metrik
Broker CpuUtilization CPUXNS
Broker MemoryUsage WSXNS
Broker CurrentConnectionsCount activeConnections
Broker EstablishedConnectionsCount activeConnections + connectionsClosed
Broker InactiveDurableTopicSubscribersCount Verwenden von Metriken für Abonnements
Broker TotalMessageCount Verwenden der Warteschlangen-/Thema-/Abonnementebene activeMessages
Warteschlange/Thema EnqueueCount incomingMessages
Warteschlange/Thema DequeueCount outgoingMessages
Warteschlange QueueSize sizeBytes

Migration

Führen Sie die Schritte in den nächsten Abschnitten aus, um Ihre vorhandene JMS 2.0-Anwendung für die Interaktion mit Service Bus zu migrieren.

Exportieren der Topologie aus ActiveMQ und Erstellen der Entitäten in Service Bus (optional)

Um sicherzustellen, dass die Clientanwendungen nahtlos eine Verbindung mit Service Bus herstellen können, migrieren Sie die Topologie (einschließlich Warteschlangen, Themen und Abonnements) von Apache ActiveMQ zu Service Bus.

Hinweis

Für JMS-Anwendungen erstellen Sie Warteschlangen, Themen und Abonnements als Laufzeitvorgang. Die meisten JMS-Anbieter (Nachrichtenbroker) bieten die Möglichkeit, sie zur Laufzeit zu erstellen. Daher wird dieser Exportschritt als optional eingestuft. Um sicherzustellen, dass Ihre Anwendung über die Berechtigungen zum Erstellen der Topologie zur Laufzeit verfügt, verwenden Sie die Verbindungszeichenfolge mit den SAS-Berechtigungen Manage.

Gehen Sie dazu folgendermaßen vor:

  1. Verwenden Sie die ActiveMQ-Befehlszeilentools, um die Topologie zu exportieren.
  2. Erstellen Sie die gleiche Topologie mit einer Azure Resource Manager-Vorlage erneut.
  3. Führen Sie die Azure Resource Manager-Vorlage aus.

Importieren der Maven-Abhängigkeit für die Service Bus JMS-Implementierung

Um eine nahtlose Verbindung mit Service Bus sicherzustellen, fügen Sie das Paket azure-servicebus-jms wie folgt der Maven-Datei pom.xml als Abhängigkeit hinzu:

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

Änderungen der Anwendungsserverkonfiguration

Dieser Teil ist für den Anwendungsserver angepasst, auf dem Ihre Clientanwendungen gehostet werden, die eine Verbindung mit ActiveMQ herstellen.

Spring-Anwendungen

Aktualisieren Sie die Datei application.properties.

Wenn Sie eine Spring Boot-Anwendung zum Herstellen einer Verbindung mit ActiveMQ verwenden, sollten Sie die ActiveMQ-spezifischen Eigenschaften aus der Datei application.properties entfernen.

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

Fügen Sie dann der Datei application.properties die für Service Bus spezifischen Eigenschaften hinzu.

azure.servicebus.connection-string=Endpoint=myEndpoint;SharedAccessKeyName=mySharedAccessKeyName;SharedAccessKey=mySharedAccessKey
Ersetzen Sie ActiveMQConnectionFactory durch ServiceBusJmsConnectionFactory.

Der nächste Schritt besteht im Ersetzen der Instanz von ActiveMQConnectionFactory durch ServiceBusJmsConnectionFactory.

Hinweis

Die tatsächlichen Codeänderungen sind spezifisch für die Anwendung und die Art der Verwaltung von Abhängigkeiten, das nachstehende Beispiel enthält jedoch eine Anleitung zu den sinnvollen Änderungen.

Zuvor haben Sie möglicherweise ein ActiveMQConnectionFactory-Objekt wie folgt instanziiert:


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

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

Nun ändern Sie dies, sodass ein ServiceBusJmsConnectionFactory-Objekt wie folgt instanziiert wird:


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();

Nach der Migration

Da Sie die Anwendung nun so geändert haben, dass sie mit dem Senden von Nachrichten an und Empfangen von Nachrichten von Service Bus beginnt, sollten Sie überprüfen, ob sie erwartungsgemäß funktioniert. Wenn das erledigt ist, können Sie den Anwendungsstapel weiter verfeinern und modernisieren.

Nächste Schritte

Verwenden Sie Spring Boot-Starter für Azure Service Bus JMS für die nahtlose Integration mit Service Bus.

Weitere Informationen zu Service Bus-Messaging und JMS finden Sie unter: