Bestaande Java Message Service (JMS) 2.0-toepassingen migreren van Apache ActiveMQ naar Azure Service Bus

In dit artikel wordt beschreven hoe u een bestaande Java Message Service (JMS) 2.0-toepassing wijzigt die communiceert met een JMS Broker om in plaats daarvan te communiceren met Azure Service Bus. In het artikel wordt met name beschreven hoe u migreert van Apache ActiveMQ of Amazon MQ.

Azure Service Bus ondersteunt Java 2 Platform-, Enterprise Edition- en Spring-workloads die gebruikmaken van de JMS 2.0-API via Advanced Message Queueing Protocol (AMQP).

Voordat u begint

Verschillen tussen Azure Service Bus en Apache ActiveMQ

Azure Service Bus en Apache ActiveMQ zijn beide berichtbrokers, die functioneren als JMS-providers voor clienttoepassingen om berichten te verzenden naar en te ontvangen van. Ze maken zowel punt-naar-punt-semantiek met wachtrijen mogelijk en publiceren-abonneren-semantiek met onderwerpen en abonnementen.

Er zijn echter enkele verschillen tussen de twee, zoals in de volgende tabel wordt weergegeven:

Categorie ActiveMQ Azure Service Bus
Toepassingslagen Geclusterde monolith Twee lagen
(gateway + back-end)
Protocolondersteuning
  • AMQP
  • STOMP
  • OpenWire
AMQP
Inrichtingsmodus
  • Infrastructure as a Service (IaaS), on-premises
  • Amazon MQ (beheerd platform als een service)
Beheerd platform als een dienst (PaaS)
Berichtgrootte Klant configureerbaar 100 MB (Premium-laag)
Hoge beschikbaarheid Door de klant beheerd Platform beheerd
Herstel na noodgeval Door de klant beheerd Platform beheerd

Huidige ondersteunde en niet-ondersteunde functies

De volgende tabel bevat de JMS-functies (Java Message Service) die momenteel door Azure Service Bus worden ondersteund. Ook worden functies weergegeven die niet worden ondersteund.

Functie API Status
Wachtrijen
  • JMSContext.createQueue( String queueName)
Ondersteund
Onderwerpen
  • JMSContext.createTopic( String topicName)
Ondersteund
Tijdelijke wachtrijen
  • JMSContext.createTemporaryQueue()
Ondersteund
Tijdelijke onderwerpen
  • JMSContext.createTemporaryTopic()
Ondersteund
Berichtproducent /
JMSProducer
  • JMSContext.createProducer()
Ondersteund
Wachtrijbrowsers
  • JMSContext.createBrowser(Queue Queue)
  • JMSContext.createBrowser(Wachtrij, Tekenreeks messageSelector)
Ondersteund
Berichtconsumer/
JMSConsumer
  • JMSContext.createConsumer( Doelbestemming)
  • JMSContext.createConsumer( Doelbestemming, Tekenreeks messageSelector)
  • JMSContext.createConsumer( Doel, Tekenreeks messageSelector, Booleaanse noLocal)

noLocal wordt momenteel niet ondersteund
Ondersteund
Gedeelde duurzame abonnementen
  • JMSContext.createSharedDurableConsumer(onderwerp, tekenreeksnaam)
  • JMSContext.createSharedDurableConsumer(onderwerp, tekenreeksnaam, tekenreeks messageSelector)
Ondersteund
Niet-gedeelde duurzame abonnementen
  • JMSContext.createDurableConsumer(onderwerp, tekenreeksnaam)
  • createDurableConsumer(Onderwerp, Tekenreeksnaam, Tekenreeks messageSelector, Booleaanse noLocal)

noLocal wordt momenteel niet ondersteund en moet worden ingesteld op false
Ondersteund
Gedeelde niet-duurzame abonnementen
  • JMSContext.createSharedConsumer(onderwerp, string sharedSubscriptionName)
  • JMSContext.createSharedConsumer(Onderwerp, String sharedSubscriptionName, String messageSelector)
Ondersteund
Niet-gedeelde niet-duurzame abonnementen
  • JMSContext.createConsumer(Doelbestemming)
  • JMSContext.createConsumer( Doelbestemming, Tekenreeks messageSelector)
  • JMSContext.createConsumer( Doel, Tekenreeks messageSelector, Booleaanse noLocal)

noLocal wordt momenteel niet ondersteund en moet worden ingesteld op false
Ondersteund
Berichtkiezers is afhankelijk van de consument die is gemaakt Ondersteund
Bezorgingsvertraging (geplande berichten)
  • JMSProducer.setDeliveryDelay( long deliveryDelay)
Ondersteund
Bericht gemaakt
  • JMSContext.createMessage()
  • JMSContext.createBytesMessage()
  • JMSContext.createMapMessage()
  • JMSContext.createObjectMessage( Serializable object)
  • JMSContext.createStreamMessage()
  • JMSContext.createTextMessage()
  • JMSContext.createTextMessage( tekenreekstekst)
Ondersteund
Transacties tussen entiteiten
  • Verbinding maken ion.createSession(true, Session.SESSION_TRANSACTED)
Ondersteund
Gedistribueerde transacties Niet ondersteund

Overwegingen

De tweelaagse aard van Azure Service Bus biedt verschillende bedrijfscontinuïteitsmogelijkheden (hoge beschikbaarheid en herstel na noodgevallen). Er zijn echter enkele overwegingen wanneer u JMS-functies gebruikt.

Service-upgrades

In het geval van service bus-upgrades en -herstarts, worden tijdelijke wachtrijen of onderwerpen verwijderd. Als uw toepassing gevoelig is voor gegevensverlies in tijdelijke wachtrijen of onderwerpen, gebruikt u geen tijdelijke wachtrijen of onderwerpen. Gebruik in plaats daarvan duurzame wachtrijen, onderwerpen en abonnementen.

Gegevensmigratie

Als onderdeel van het migreren en wijzigen van uw clienttoepassingen om te communiceren met Azure Service Bus, worden de gegevens in ActiveMQ niet gemigreerd naar Service Bus. Mogelijk hebt u een aangepaste toepassing nodig om de ActiveMQ-wachtrijen, onderwerpen en abonnementen leeg te maken en de berichten vervolgens opnieuw af te spelen op de wachtrijen, onderwerpen en abonnementen van Service Bus.

Verificatie en autorisatie

Op rollen gebaseerd toegangsbeheer van Azure (Azure RBAC), ondersteund door Microsoft Entra ID, is het voorkeursverificatiemechanisme voor Service Bus. Als u op rollen gebaseerd toegangsbeheer wilt inschakelen, volgt u de stappen in de ontwikkelaarshandleiding voor Azure Service Bus JMS 2.0.

Premigratie

Versiecontrole

U gebruikt de volgende onderdelen en versies tijdens het schrijven van de JMS-toepassingen:

Onderdeel Versie
JMS-API (Java Message Service) 1.1 of hoger
AMQP-protocol 1.0

Zorg ervoor dat AMQP-poorten zijn geopend

Service Bus ondersteunt communicatie via het AMQP-protocol. Hiervoor schakelt u communicatie via poorten 5671 (AMQP) en 443 (TCP) in. Afhankelijk van waar de clienttoepassingen worden gehost, hebt u mogelijk een ondersteuningsticket nodig om communicatie via deze poorten toe te staan.

Belangrijk

Service Bus ondersteunt alleen het AMQP 1.0-protocol.

Bedrijfsconfiguraties instellen

Service Bus maakt verschillende functies voor bedrijfsbeveiliging en hoge beschikbaarheid mogelijk. Zie voor meer informatie:

Bewaking, waarschuwingen en tracering

Voor elke Service Bus-naamruimte publiceert u metrische gegevens naar Azure Monitor. U kunt deze metrische gegevens gebruiken voor waarschuwingen en dynamisch schalen van resources die zijn toegewezen aan de naamruimte.

Zie Service Bus-metrische gegevens in Azure Monitor voor meer informatie over de verschillende metrische gegevens en het instellen van waarschuwingen. U vindt ook meer informatie over tracering aan de clientzijde voor gegevensbewerkingen en operationele/diagnostische logboekregistratie voor beheerbewerkingen.

Metrische gegevens - New Relic

U kunt correleren welke metrische gegevens van ActiveMQ zijn toegewezen aan welke metrische gegevens in Azure Service Bus. Zie het volgende op de Website van New Relic:

Notitie

Op dit moment heeft New Relic geen directe, naadloze integratie met ActiveMQ, maar ze hebben wel metrische gegevens die beschikbaar zijn voor Amazon MQ. Omdat Amazon MQ is afgeleid van ActiveMQ, wijst de volgende tabel de metrische gegevens van New Relic toe van Amazon MQ naar Azure Service Bus.

Groeperen van metrische gegevens Metrische gegevens amazon MQ/ActiveMQ Metrische gegevens van Azure Service Bus
Broker CpuUtilization CPUXNS
Broker MemoryUsage WSXNS
Broker CurrentConnectionsCount activeConnections
Broker EstablishedConnectionsCount activeConnections + connectionsClosed
Broker InactiveDurableTopicSubscribersCount Metrische abonnementsgegevens gebruiken
Broker TotalMessageCount Wachtrij-/onderwerp-/abonnementsniveau gebruiken activeMessages
Wachtrij/onderwerp EnqueueCount incomingMessages
Wachtrij/onderwerp DequeueCount outgoingMessages
Wachtrij QueueSize sizeBytes

Migratie

Als u uw bestaande JMS 2.0-toepassing wilt migreren om te communiceren met Service Bus, volgt u de stappen in de volgende secties.

De topologie exporteren vanuit ActiveMQ en de entiteiten maken in Service Bus (optioneel)

Om ervoor te zorgen dat clienttoepassingen naadloos verbinding kunnen maken met Service Bus, migreert u de topologie (inclusief wachtrijen, onderwerpen en abonnementen) van Apache ActiveMQ naar Service Bus.

Notitie

Voor JMS-toepassingen maakt u wachtrijen, onderwerpen en abonnementen als runtimebewerking. De meeste JMS-providers (berichtenbrokers) bieden u de mogelijkheid om deze tijdens runtime te maken. Daarom wordt deze exportstap als optioneel beschouwd. Gebruik de verbindingsreeks met SAS-machtigingen Manage om ervoor te zorgen dat uw toepassing de machtigingen heeft om de topologie tijdens runtime te maken.

Dit doet u als volgt:

  1. Gebruik de ActiveMQ-opdrachtregelprogramma's om de topologie te exporteren.
  2. Maak dezelfde topologie opnieuw met behulp van een Azure Resource Manager-sjabloon.
  3. Voer de Azure Resource Manager-sjabloon uit.

De maven-afhankelijkheid importeren voor Service Bus JMS-implementatie

Om naadloze connectiviteit met Service Bus te garanderen, voegt u het azure-servicebus-jms pakket als een afhankelijkheid toe aan het Maven-bestand pom.xml , als volgt:

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

Wijzigingen in de configuratie van de toepassingsserver

Dit onderdeel is aangepast aan de toepassingsserver die als host fungeert voor uw clienttoepassingen die verbinding maken met ActiveMQ.

Spring-toepassingen

Het bestand bijwerken application.properties

Als u een Spring Boot-toepassing gebruikt om verbinding te maken met ActiveMQ, wilt u de activeMQ-specifieke eigenschappen uit het application.properties bestand verwijderen.

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

Voeg vervolgens de Service Bus-specifieke eigenschappen toe aan het application.properties bestand.

azure.servicebus.connection-string=Endpoint=myEndpoint;SharedAccessKeyName=mySharedAccessKeyName;SharedAccessKey=mySharedAccessKey
Vervang ActiveMQConnectionFactory door ServiceBusJmsConnectionFactory

De volgende stap is het vervangen van het exemplaar van ActiveMQConnectionFactory de ServiceBusJmsConnectionFactory.

Notitie

De daadwerkelijke codewijzigingen zijn specifiek voor de toepassing en hoe afhankelijkheden worden beheerd, maar het volgende voorbeeld bevat de richtlijnen voor wat moet worden gewijzigd.

Eerder hebt u mogelijk als volgt een exemplaar gemaakt van een object:ActiveMQConnectionFactory


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

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

U wijzigt dit nu als volgt om een object van ServiceBusJmsConnectionFactory, als volgt te instantiëren:


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

Postmigratie

Nu u de toepassing hebt gewijzigd om te beginnen met het verzenden en ontvangen van berichten van Service Bus, moet u controleren of deze werkt zoals verwacht. Wanneer dat is gebeurd, kunt u doorgaan met het verfijnen en moderniseren van uw toepassingsstack.

Volgende stappen

Gebruik Spring Boot Starter voor Azure Service Bus JMS voor naadloze integratie met Service Bus.

Zie voor meer informatie over Service Bus-berichten en JMS: