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 bijzonder bevat het artikel de migratie 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 berichtenbrokers die als JMS-providers werken voor clienttoepassingen om berichten naar te verzenden en van te ontvangen. Ze maken beide de point-to-point-semantiek met wachtrijen mogelijk en publiceren-abonneren semantiek met onderwerpen en abonnementen.

Er zijn echter enkele verschillen tussen de twee, zoals de volgende tabel laat zien:

Categorie ActiveMQ Azure Service Bus
Opslag in toepassingslagen Geclusterde monoliet Twee lagen
(gateway + back-end)
Protocolondersteuning
  • AMQP
  • STOMP
  • OpenWire
AMQP
Inrichtingsmodus
  • Infrastructure as a Service (IaaS), on-premises
  • Amazon MQ (beheerde platform as a service)
Beheerde platform as a service (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 Java Message Service-functies (JMS) die momenteel Service Bus Azure-service. U ziet ook functies 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(Wachtrijwachtrij)
  • JMSContext.createBrowser(Wachtrijwachtrij, TekenreeksberichtSelector)
Ondersteund
Bericht consumer/
JMSConsumer
  • JMSContext.createConsumer( Doelbestemming)
  • JMSContext.createConsumer( Doelbestemming, TekenreeksberichtSelector)
  • JMSContext.createConsumer( Doelbestemming, TekenreeksberichtSelector, Booleaanse noLocal)

noLocal wordt momenteel niet ondersteund
Ondersteund
Gedeelde duurzame abonnementen
  • JMSContext.createSharedDurableConsumer(Onderwerponderwerp, Tekenreeksnaam)
  • JMSContext.createSharedDurableConsumer(Onderwerponderwerp, Tekenreeksnaam, TekenreeksberichtSelector)
Ondersteund
Niet-gedeeld duurzame abonnementen
  • JMSContext.createDurableConsumer(Onderwerponderwerp, Tekenreeksnaam)
  • createDurableConsumer(Onderwerponderwerp, Tekenreeksnaam, TekenreeksberichtSelector, Booleaanse noLocal)

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

noLocal wordt momenteel niet ondersteund en moet worden ingesteld op false
Ondersteund
Berichtverdelers is afhankelijk van de gemaakte consument Ondersteund
Vertraging bij levering (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
  • Connection.createSession(true, Session.SESSION_TRANSACTED)
Ondersteund
Gedistribueerde transacties Niet ondersteund

Overwegingen

De tweelaagse aard van Azure Service Bus verschillende mogelijkheden voor bedrijfscontinuïteit (hoge beschikbaarheid en herstel na noodgevallen). Er zijn echter enkele overwegingen bij het gebruik van JMS-functies.

Service-upgrades

In het geval van service bus-upgrades en opnieuw opstarten, 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 die zijn opgeslagen 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), dat wordt Azure Active Directory, is het voorkeursverificatiemechanisme voor Service Bus. Omdat Azure RBAC, of verificatie op basis van een claim, momenteel niet wordt ondersteund door Apache QPID JMS, moet u echter SAS-sleutels gebruiken voor verificatie.

Premigratie

Versiecontrole

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

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

Controleren of DE AMQP-poorten zijn geopend

Service Bus ondersteunt communicatie via het AMQP-protocol. Schakel hiervoor communicatie in via de poorten 5671 (AMQP) en 443 (TCP). 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 Metrische gegevens in Service Bus voor meer informatie over de verschillende metrische gegevens en het instellen van waarschuwingen Azure Monitor. U kunt ook meer informatie vinden 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 gekoppeld aan welke metrische gegevens in Azure Service Bus. Zie het volgende op de New Relic website:

Notitie

Op dit New Relic geen directe, naadloze integratie met ActiveMQ, maar ze hebben wel metrische gegevens beschikbaar voor Amazon MQ. Omdat Amazon MQ is afgeleid van ActiveMQ, worden in de volgende tabel de New Relic metrische gegevens van Amazon MQ aan Azure Service Bus.

Groeperen van metrische gegevens Amazon MQ/ActiveMQ-metrische gegevens Metrische Service Bus Azure-gegevens
Makelaar CpuUtilization CPUXNS
Makelaar MemoryUsage WSXNS
Makelaar CurrentConnectionsCount activeConnections
Makelaar EstablishedConnectionsCount activeConnections + connectionsClosed
Makelaar InactiveDurableTopicSubscribersCount Metrische gegevens van abonnement gebruiken
Makelaar 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 voor interactie 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 een runtimebewerking. De meeste JMS-providers (berichtenbrokers) bieden u de mogelijkheid om deze te maken tijdens runtime. Daarom wordt deze exportstap als optioneel beschouwd. Om ervoor te zorgen dat uw toepassing de machtigingen heeft om de topologie tijdens runtime te maken, gebruikt u de connection string Manage sas-machtigingen.

Om dit te doen:

  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 sjabloon Azure Resource Manager uit.

De Maven-afhankelijkheid importeren voor Service Bus JMS-implementatie

Voor naadloze connectiviteit met Service Bus voegt u het pakket als een afhankelijkheid toe aan azure-servicebus-jms het pom.xml Maven-bestand, 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 voor uw clienttoepassingen verbinding maakt met ActiveMQ.

Spring-toepassingen

Het bestand application.properties bijwerken

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

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

Voeg vervolgens de specifieke Service Bus 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 ActiveMQConnectionFactory van door de ServiceBusJmsConnectionFactory .

Notitie

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

Eerder hebt u mogelijk als volgt een instantiërend object van ActiveMQConnectionFactory gemaakt:


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

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

Nu gaat u dit wijzigen om als volgt een instantie van een object van ServiceBusJmsConnectionFactory te maken:


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 berichten te verzenden en te ontvangen van Service Bus, moet u controleren of deze werkt zoals verwacht. Wanneer dat is gebeurd, kunt u doorgaan met het verder verfijnen en moderniseren van uw toepassingsstack.

Volgende stappen

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

Zie voor meer informatie over Service Bus messaging en JMS: