Migrer des applications JMS (Java Message Service) 2.0 existantes d’Apache ActiveMQ vers Azure Service Bus

Cet article explique comment modifier une application Java Message Service (JMS) 2.0 qui interagit avec un répartiteur JMS afin qu’elle interagisse avec Azure Service Bus à la place. En particulier, l’article traite de la migration à partir d’Apache ActiveMQ ou d’Amazon MQ.

Azure Service Bus prend en charge les charges de travail de la plateforme Java 2, Édition Entreprise et Spring qui utilisent l’API JMS 2.0 sur AMQP (Advanced Message Queueing Protocol).

Avant de commencer

Différences entre Azure Service Bus et Apache ActiveMQ

Azure Service Bus et Apache ActiveMQ sont tous deux des répartiteurs de messages, qui fonctionnent en tant que fournisseurs JMS avec lesquels les applications clientes échangent des messages. Ils activent tous les deux la sémantique point-à-point avec des files d’attente et la sémantique de publication-abonnement avec des rubriques et des abonnements.

Même dans ce cas, il existe des différences entre les deux, comme le montre le tableau suivant :

Category ActiveMQ Azure Service Bus
Hiérarchisation des applications Monolithe en cluster À deux niveaux
(passerelle + back-end)
Prise en charge de protocole
  • AMQP
  • STOMP
  • OpenWire
AMQP
Mode de provisionnement
  • IaaS (Infrastructure as a service), localement
  • Amazon MQ (plateforme managée en tant que service)
Plateforme managée en tant que service (PaaS)
Taille des messages Configurable par le client 100 Mo (niveau Premium)
Haute disponibilité Managée par le client Managée par la plateforme
Récupération d'urgence Managée par le client Managée par la plateforme

Fonctionnalités prises en charge et non prises en charge actuellement

Le tableau suivant présente les fonctionnalités Java Message Service (JMS) actuellement prises en charge par Azure Service Bus. Il présente également des fonctionnalités non prises en charge.

Fonctionnalité API Statut
Files d’attente
  • JMSContext.createQueue( String queueName)
Pris en charge
Rubriques
  • JMSContext.createTopic( String topicName)
Pris en charge
Files d’attente temporaires
  • JMSContext.createTemporaryQueue()
Pris en charge
Rubriques temporaires
  • JMSContext.createTemporaryTopic()
Pris en charge
Producteur de messages /
JMSProducer
  • JMSContext.createProducer()
Pris en charge
Explorateurs de files d'attente
  • JMSContext.createBrowser(Queue queue)
  • JMSContext.createBrowser(Queue queue, String messageSelector)
Pris en charge
Consommateur de messages/
JMSConsumer
  • JMSContext.createConsumer( Destination destination)
  • JMSContext.createConsumer( Destination destination, String messageSelector)
  • JMSContext.createConsumer( Destination destination, String messageSelector, boolean noLocal)

noLocal n'est actuellement pas pris en charge
Pris en charge
Abonnements durables partagés
  • JMSContext.createSharedDurableConsumer(Topic topic, String name)
  • JMSContext.createSharedDurableConsumer(Topic topic, String name, String messageSelector)
Pris en charge
Abonnements durables non partagés
  • JMSContext.createDurableConsumer(Topic topic, String name)
  • createDurableConsumer(Topic topic, String name, String messageSelector, boolean noLocal)

noLocal n'est actuellement pas pris en charge et doit être défini sur false
Pris en charge
Abonnements non durables partagés
  • JMSContext.createSharedConsumer(Topic topic, String sharedSubscriptionName)
  • JMSContext.createSharedConsumer(Topic topic, String sharedSubscriptionName, String messageSelector)
Pris en charge
Abonnements non durables non partagés
  • JMSContext.createConsumer(Destination destination)
  • JMSContext.createConsumer( Destination destination, String messageSelector)
  • JMSContext.createConsumer( Destination destination, String messageSelector, boolean noLocal)

noLocal n'est actuellement pas pris en charge et doit être défini sur false
Pris en charge
Sélecteurs de messages dépend du consommateur créé Pris en charge
Délai de livraison (messages planifiés)
  • JMSProducer.setDeliveryDelay( long deliveryDelay)
Pris en charge
Message créé
  • JMSContext.createMessage()
  • JMSContext.createBytesMessage()
  • JMSContext.createMapMessage()
  • JMSContext.createObjectMessage( Serializable object)
  • JMSContext.createStreamMessage()
  • JMSContext.createTextMessage()
  • JMSContext.createTextMessage( String text)
Pris en charge
Transactions entre entités
  • Connection.createSession(true, Session.SESSION_TRANSACTED)
Pris en charge
Transactions distribuées Non pris en charge

Considérations

La nature à deux niveaux d’Azure Service Bus offre différentes fonctionnalités de continuité d’activité (haute disponibilité et reprise d’activité). Toutefois, certaines considérations sont à prendre en compte quand vous utilisez des fonctionnalités JMS.

Mises à niveau de service

En cas de mises à niveau et de redémarrages de Service Bus, les files d’attente ou les rubriques temporaires sont supprimées. Si votre application est sensible à la perte de données dans les files d’attente ou les rubriques temporaires, n’utilisez pas de files d’attente ou de rubriques temporaires. Utilisez à la place des files d’attente, des rubriques et des abonnements durables.

Migration des données

Dans le cadre de la migration et de la modification de vos applications clientes pour qu’elles interagissent avec Azure Service Bus, les données conservées dans ActiveMQ ne sont pas migrées vers Service Bus. Une application personnalisée peut vous être nécessaire pour vider les files d’attente, les rubriques et les abonnements ActiveMQ, puis relire les messages dans les files d’attente, les rubriques et les abonnements de Service Bus.

Authentification et autorisation

Le contrôle d’accès en fonction du rôle Azure (Azure RBAC) soutenu par Microsoft Entra ID est le mécanisme d’authentification à privilégier pour Service Bus. Pour activer le contrôle d’accès en fonction du rôle, suivez les étapes décrites dans le guide du développeur Azure Service Bus JMS 2.0.

Prémigration

Vérification de la version

Vous utilisez les composants et versions suivants lors de l’écriture des applications JMS :

Composant Version
API JMS (Java Message Service) 1.1 ou ultérieure
Protocole AMQP 1.0

Vérifier que les ports AMQP sont ouverts

Service Bus prend en charge la communication par le biais du protocole AMQP. À cet effet, activez la communication sur les ports 5671 (AMQP) et 443 (TCP). Selon l’emplacement où les applications clientes sont hébergées, vous pouvez avoir besoin d’un ticket de support pour autoriser la communication sur ces ports.

Important

Service Bus prend uniquement en charge le protocole AMQP 1.0.

Élaborer des configurations d’entreprise

Service Bus offre différentes fonctionnalités de haute disponibilité et de sécurité de l’entreprise. Pour plus d'informations, consultez les pages suivantes :

Supervision, alertes et suivi

Pour chaque espace de noms Service Bus, vous publiez des métriques sur Azure Monitor. Vous pouvez utiliser ces métriques à des fins d’alerte et de mise à l’échelle dynamique des ressources allouées à l’espace de noms.

Pour plus d’informations sur les différentes métriques et sur la configuration d’alertes sur celles-ci, consultez Métriques Service Bus dans Azure Monitor. Vous pouvez également consulter les articles sur le suivi côté client des opérations de données et la journalisation opérationnelle/des diagnostics pour les opérations de gestion.

Métriques - New Relic

Vous pouvez établir une correspondance entre les métriques ActiveMQ et les métriques Azure Service Bus. Consultez les informations suivantes sur le site New Relic :

Notes

New Relic n’offre pas d’intégration fluide et directe à ActiveMQ, mais des métriques sont disponibles pour Amazon MQ. Amazon MQ étant dérivé d’ActiveMQ, le tableau suivant mappe les métriques New Relic d’AmazonMQ à Azure Service Bus.

Regroupement des métriques Métrique Amazon MQ/ActiveMQ Métrique Azure Service Bus
Service Broker CpuUtilization CPUXNS
Service Broker MemoryUsage WSXNS
Service Broker CurrentConnectionsCount activeConnections
Service Broker EstablishedConnectionsCount activeConnections + connectionsClosed
Service Broker InactiveDurableTopicSubscribersCount Utiliser les métriques des abonnements
Service Broker TotalMessageCount Utiliser le niveau file d’attente/rubrique/abonnement activeMessages
File d’attente/Rubrique EnqueueCount incomingMessages
File d’attente/Rubrique DequeueCount outgoingMessages
File d'attente QueueSize sizeBytes

Migration

Pour migrer votre application JMS 2.0 existante afin d’interagir avec Service Bus, suivez les étapes décrites dans les sections suivantes.

Exporter la topologie à partir d’ActiveMQ et créer les entités dans Service Bus (facultatif)

Pour que les applications clientes puissent se connecter de façon fluide à Service Bus, migrez la topologie (y compris les files d’attente, les rubriques et les abonnements) d’Apache ActiveMQ vers Service Bus.

Notes

Pour les applications JMS, vous créez les files d’attente, les rubriques et les abonnements en tant qu’opération d’exécution. La plupart des fournisseurs JMS (courtiers de messages) vous donnent la possibilité de les créer au moment de l’exécution. C’est pourquoi cette étape d’exportation est considérée comme facultative. Pour être sûr que votre application dispose des autorisations nécessaires pour créer la topologie au moment de l’exécution, utilisez la chaîne de connexion avec les autorisations Manage SAS.

Pour ce faire :

  1. Utilisez les outils en ligne de commande ActiveMQ pour exporter la topologie.
  2. Recréez la même topologie à l’aide d’un modèle Azure Resource Manager.
  3. Exécutez le modèle Azure Resource Manager.

Importer la dépendance Maven pour l’implémentation JMS Service Bus

Pour garantir une connectivité fluide avec Service Bus, ajoutez le package azure-servicebus-jms en tant que dépendance au fichier Maven pom.xml, comme suit :

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

Modifications de configuration du serveur d’applications

Cette partie est personnalisée pour le serveur d’applications qui héberge vos applications clientes se connectant à ActiveMQ.

Applications Spring

Mettre à jour le fichier application.properties

Si vous utilisez une application Spring Boot pour vous connecter à ActiveMQ, supprimez les propriétés spécifiques à ActiveMQ du fichier application.properties.

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

Ensuite, ajoutez les propriétés propres à Service Bus au fichier application.properties.

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

L’étape suivante consiste à remplacer l’instance de ActiveMQConnectionFactory par ServiceBusJmsConnectionFactory.

Notes

Les modifications de code réelles sont propres à l’application et à la façon dont les dépendances sont gérées, mais l’exemple suivant fournit des conseils sur ce qui doit être changé.

Auparavant, vous deviez instancier un objet d’ActiveMQConnectionFactory, comme suit :


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

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

À présent, vous instanciez un objet de ServiceBusJmsConnectionFactory, comme suit :


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

Postmigration

Maintenant que vous avez modifié l’application pour qu’elle commence à envoyer et à recevoir des messages de Service Bus, vous devez vérifier qu’elle fonctionne comme prévu. Quand cette opération est terminée, vous pouvez affiner et moderniser votre pile d’application.

Étapes suivantes

Utilisez Spring Boot Starter pour Azure Service Bus JMS afin de bénéficier d’une intégration fluide à Service Bus.

Pour plus d’informations sur la messagerie Service Bus et JMS, consultez :