Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Ce guide fournit des informations détaillées pour vous aider à communiquer avec Azure Service Bus à l’aide de l’API Java Message Service (JMS) 2.0.
En tant que développeur Java, si vous débutez avec Azure Service Bus, envisagez de lire les articles suivants.
| Mise en route | Les concepts |
|---|---|
modèle de programmation Java Message Service (JMS)
Le modèle de programmation de l’API Java Message Service est décrit dans les sections suivantes :
Remarque
Le niveau Premium Azure Service Bus prend en charge JMS 1.1 et JMS 2.0.
Azure Service Bus - Le niveau Standard prend en charge des fonctionnalités JMS 1.1 limitées. Pour plus d’informations, consultez cette documentation.
JMS - Blocs de construction
Utilisez les blocs de construction suivants pour communiquer avec l’application JMS.
Remarque
Ce guide est adapté à partir du didacticiel Oracle Java EE 6 pour Java Message Service (JMS).
Pour mieux comprendre le Java Message Service (JMS), reportez-vous à ce didacticiel.
Fabrique de connexion
Remarque
La azure-servicebus-jms bibliothèque est disponible dans deux variantes : com.azure:azure-servicebus-jms (version 2.0.0+) pour Jakarta EE (jakarta.jms.*) et com.microsoft.azure:azure-servicebus-jms (version 1.0.x) pour Java EE (javax.jms.*). Pour obtenir des conseils sur le choix de l’artefact approprié, veuillez consulter la section Prise en charge de Jakarta EE et javax.
Le client utilise l'objet factory de connexion pour se connecter au fournisseur JMS. L'usine de connexions encapsule un ensemble des paramètres de configuration de connexion que l’administrateur définit.
Chaque fabrique de connexion est une instance de l’interface ConnectionFactory, QueueConnectionFactory ou TopicConnectionFactory.
Pour simplifier la connexion à Azure Service Bus, ces interfaces sont implémentées via ServiceBusJmsConnectionFactory, ServiceBusJmsQueueConnectionFactory ou ServiceBusJmsTopicConnectionFactory respectivement.
Important
Les applications Java qui utilisent l’API JMS 2.0 peuvent se connecter à Azure Service Bus à l’aide de la chaîne de connexion ou à l’aide d’un TokenCredential pour tirer parti de l’authentification Microsoft Entra prise en charge. Lorsque vous utilisez Microsoft Entra authentification sauvegardée, veillez à affecter des rôles et des autorisations à l’identité en fonction des besoins.
Créez une identité managée affectée par le système sur Azure et utilisez cette identité pour créer un TokenCredential.
TokenCredential tokenCredential = new DefaultAzureCredentialBuilder().build();
Vous pouvez instancier l'usine de connexion avec les paramètres suivants :
- Informations d’identification du jeton : cela représente une information d’identification capable de fournir un jeton OAuth.
- Hôte : nom d’hôte de l’espace de noms de niveau Premium Azure Service Bus.
- Ensemble de propriétés ServiceBusJmsConnectionFactorySettings, qui contient :
-
connectionIdleTimeoutMS- Délai d’inactivité de la connexion en millisecondes. -
traceFrames: indicateur booléen permettant de collecter des trames de trace AMQP pour le débogage. - Autres paramètres de configuration.
-
Créez la fabrique comme indiqué dans l’exemple suivant. Les informations d’identification et l’hôte du jeton sont des paramètres requis, mais les autres propriétés sont facultatives.
String host = "<YourNamespaceName>.servicebus.windows.net";
ConnectionFactory factory = new ServiceBusJmsConnectionFactory(tokenCredential, host, null);
Destination JMS
Une destination est l’objet qu’un client utilise pour spécifier la cible des messages qu’il produit et la source des messages qu’il consomme.
Les destinations sont mappées vers les entités dans les files d’attente (dans les scénarios point à point) et les rubriques (dans les scénarios publication-abonnement) d’Azure Service Bus.
Connexions
Une connexion encapsule une connexion virtuelle avec un fournisseur JMS. Avec Azure Service Bus, cela représente une connexion avec état entre l’application et Azure Service Bus par AMQP.
Créez une connexion à partir de l'usine de connexions, comme indiqué dans l’exemple suivant :
Connection connection = factory.createConnection();
Séances
Une session est un contexte à thread unique pour la production et la consommation de messages. Utilisez-le pour créer des messages, des producteurs de messages et des consommateurs. Il fournit également un contexte transactionnel pour regrouper les envois et les réceptions dans une unité atomique de travail.
Créez une session à partir de l’objet de connexion, comme illustré dans l’exemple suivant :
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
Remarque
L’API JMS ne prend pas en charge la réception de messages à partir de files d’attente ou de rubriques Service Bus avec les sessions de messagerie activées.
Modes de session
Créez une session avec l’un des modes suivants.
| Modes de session | Comportement |
|---|---|
| Session.AUTO_ACKNOWLEDGE | La session accuse automatiquement réception de la réception d’un message par un client soit lorsque la session revient avec succès d’un appel de réception, soit lorsque l’écouteur de message que la session appelle pour traiter le message revient avec succès. |
| Session.CLIENT_ACKNOWLEDGE | Le client accuse réception d’un message consommé en appelant la méthode d’accusé de réception du message. |
| Session.DUPS_OK_ACKNOWLEDGE | Ce mode d’accusé de réception demande à la session d’accuser réception de la remise des messages en différé. |
| Session.SESSION_TRANSACTED | Transmettez cette valeur en tant qu’argument à la méthode createSession(int sessionMode) sur l’objet Connection pour spécifier que la session doit utiliser une transaction locale. |
Si vous ne spécifiez pas le mode session, la valeur par défaut est Session.AUTO_ACKNOWLEDGE.
JMSContext
Remarque
JMSContext est défini dans le cadre de la spécification JMS 2.0.
JMSContext combine les fonctionnalités fournies par l’objet de connexion et de session. Vous le créez à partir de l’objet de fabrique de connexion.
JMSContext context = connectionFactory.createContext();
Modes JMSContext
Tout comme l’objet Session, vous pouvez créer le JMSContext avec les mêmes modes d’accusé de réception que ceux indiqués dans Modes de session.
JMSContext context = connectionFactory.createContext(JMSContext.AUTO_ACKNOWLEDGE);
Si vous ne spécifiez pas de mode, la valeur par défaut est JMSContext.AUTO_ACKNOWLEDGE.
Producteurs de messages JMS
Un producteur de messages est un objet que vous créez à l’aide d’un JMSContext ou d’une session. Utilisez-le pour envoyer des messages à une destination.
Vous pouvez le créer en tant qu’objet autonome, comme illustré dans l’exemple suivant :
JMSProducer producer = context.createProducer();
Vous pouvez également le créer au moment de l’exécution lorsque vous devez envoyer un message.
context.createProducer().send(destination, message);
Consommateurs de messages JMS
Un consommateur de messages est un objet créé par un JMSContext ou une session. Utilisez-la pour recevoir des messages envoyés à une destination. Créez-le comme indiqué dans l’exemple suivant :
JMSConsumer consumer = context.createConsumer(dest);
Réceptions synchrones via la méthode receive()
Le consommateur de messages fournit un moyen synchrone de recevoir des messages de la destination via la receive() méthode.
Si vous ne spécifiez pas d’arguments ou de délai d’expiration, ou si vous spécifiez un délai d’expiration 0, le consommateur bloque indéfiniment, sauf si le message arrive, ou si la connexion est interrompue (selon ce qui est antérieur).
Message m = consumer.receive();
Message m = consumer.receive(0);
Lorsque vous fournissez un argument positif différent de zéro, le consommateur se bloque jusqu’à ce que le temporisateur expire.
Message m = consumer.receive(1000); // time out after one second.
Réceptions asynchrones avec les écouteurs de messages JMS
Un écouteur de message est un objet que vous utilisez pour la gestion asynchrone des messages sur une destination. Il implémente l’interface MessageListener , qui contient la méthode dans laquelle la onMessage logique métier spécifique doit vivre.
Vous devez instancier un objet écouteur de message et l’inscrire auprès d’un consommateur de messages spécifique à l’aide de la méthode setMessageListener.
Listener myListener = new Listener();
consumer.setMessageListener(myListener);
Utilisation à partir de rubriques
Vous créez les consommateurs de messages JMS à partir d’une destination, qui peut être une file d’attente ou un topic.
Les consommateurs sur les files d’attente sont simplement des objets côté client qui vivent dans le contexte de la session (et de la connexion) entre l’application cliente et Azure Service Bus.
En revanche, les consommateurs sur les topics comportent deux parties :
- Objet côté client qui réside dans le contexte de la session (ou JMSContext) et
- Un abonnement qui est une entité sur Azure Service Bus.
Les abonnements sont documentés ici et peuvent être l’un des types suivants :
- Abonnements durables partagés
- Abonnements non durables partagés
- Abonnements durables non partagés
- Abonnements non durables non partagés
Explorateurs de files d’attente JMS
L’API JMS fournit un QueueBrowser objet que l’application peut utiliser pour parcourir les messages dans la file d’attente et afficher les valeurs d’en-tête pour chaque message.
Vous pouvez créer un navigateur de files d’attente à l’aide de JMSContext, comme illustré dans l’exemple suivant :
QueueBrowser browser = context.createBrowser(queue);
Remarque
L’API JMS ne fournit pas d’API pour parcourir une rubrique.
Cette limitation existe, car la rubrique elle-même ne stocke pas les messages. Dès que le message est envoyé à la rubrique, il est transféré aux abonnements appropriés.
Sélecteurs de messages JMS
Les applications de réception peuvent utiliser des sélecteurs de messages pour filtrer les messages qu'elles reçoivent. En utilisant des sélecteurs de messages, l’application de réception décharge le travail de filtrage des messages vers le fournisseur JMS (dans ce cas, Azure Service Bus) au lieu de prendre cette responsabilité elle-même.
Vous pouvez utiliser des sélecteurs lors de la création d’un des consommateurs suivants :
- Abonnement durable partagé
- Abonnement durable non partagé
- Abonnement non durable partagé
- Abonnement non durable non partagé
- Consommateur de file d’attente
- Navigateur de file d’attente
Remarque
Les sélecteurs de Service Bus ne prennent pas en charge les mots clés SQL LIKE et BETWEEN.
Messages planifiés (délai de remise)
JMS 2.0 prend en charge la planification d’un message pour une remise ultérieure en utilisant la méthode setDeliveryDelay sur un MessageProducer ou un JMSProducer. Lorsque vous définissez cette propriété, Service Bus accepte le message, mais le rend visible uniquement aux consommateurs une fois la période de retard écoulée.
MessageProducer producer = session.createProducer(queue);
// Schedule a message for delivery 30 seconds from now
producer.setDeliveryDelay(30000);
producer.send(session.createTextMessage("Scheduled message"));
Pour obtenir un exemple de travail complet, consultez QueueScheduledSend.java dans le référentiel azure-servicebus-jms-samples.
Sélection et résilience de l'usine de connexion
Lorsque vous utilisez ServiceBusJmsConnectionFactory dans Spring Boot ou d’autres frameworks qui gèrent les connexions JMS, choisissez le wrapper de fabrique de connexion approprié pour les émetteurs et les écouteurs afin de garantir un fonctionnement fiable.
Configuration recommandée
| Rôle | Fabrique de connexion | Pourquoi |
|---|---|---|
Expéditeurs (JmsTemplate) |
CachingConnectionFactory Emballage ServiceBusJmsConnectionFactory |
JmsTemplate crée et ferme une connexion par envoi par défaut.
CachingConnectionFactory gère une seule connexion AMQP et met en cache les sessions, évitant ainsi le renouvellement de connexion qui peut épuiser les ressources du broker sous charge. |
Écouteurs (@JmsListener, DefaultMessageListenerContainer) |
Brut ServiceBusJmsConnectionFactory (non emballé) |
Chaque conteneur d’écouteurs obtient sa propre connexion AMQP avec un cycle de vie indépendant. Si une connexion échoue (expiration du jeton, mise à niveau de la passerelle, blip réseau), seul cet écouteur est affecté et Spring recrée automatiquement la connexion. |
Ce qu'il faut éviter pour les auditeurs
Avertissement
Ne jamais utiliser SingleConnectionFactory avec des conteneurs d’écouteurs. Il force tous les écouteurs à partager une seule connexion JMS. Si cette connexion est interrompue pour une raison quelconque, tous les écouteurs perdent la connectivité simultanément et ne peuvent pas récupérer indépendamment. Utilisez le conteneur brut ServiceBusJmsConnectionFactory afin que chaque conteneur d’écouteur gère sa propre connexion.
CachingConnectionFactory sur les conteneurs de l’écouteur peut également entraîner des problèmes, car les sessions mises en cache peuvent référencer une connexion sous-jacente obsolète. Pour les écouteurs, la fabrique brute garantit que chaque conteneur peut créer une nouvelle connexion indépendamment.
Spring Cloud Azure valeurs par défaut
Si vous utilisez spring-cloud-azure-starter-servicebus-jms (version 6.2.0+), le démarrage applique cette séparation de fabrique par défaut :
spring.jms.servicebus.pool.enabled |
spring.jms.cache.enabled |
Fabrique d’émetteurs | Fabrique d’écouteurs |
|---|---|---|---|
| (non défini) | (non défini) | CachingConnectionFactory |
ServiceBusJmsConnectionFactory |
| (non défini) | true |
CachingConnectionFactory |
CachingConnectionFactory |
| (non défini) | false |
ServiceBusJmsConnectionFactory |
ServiceBusJmsConnectionFactory |
true |
(non défini) | JmsPoolConnectionFactory |
JmsPoolConnectionFactory |
Sur les versions antérieures (pré-6.2.0), les expéditeurs et les écouteurs utilisent ServiceBusJmsConnectionFactory par défaut, ce qui entraîne la création d’une connexion par envoi.
Ajout d’un écouteur d’exception
Sans gestionnaire d'exceptions, les interruptions de connexion se produisent sans aucune notification. Ajoutez un jakarta.jms.ExceptionListener aux fabriques d’émetteurs et d’écouteurs afin d’améliorer l’observabilité :
connection.setExceptionListener(exception -> {
log.error("JMS connection error: {}", exception.getMessage(), exception);
});
Dans Spring Boot, définissez l'écouteur d’exception sur le CachingConnectionFactory (pour les émetteurs) et le DefaultJmsListenerContainerFactory (pour les auditeurs).
Pour obtenir un exemple de travail complet montrant tous ces modèles, consultez l’exemple Spring Boot JMS Resilience dans le référentiel azure-servicebus-jms-samples.
Files d’attente de lettres mortes
Chaque file d’attente et chaque abonnement à un topic dans Azure Service Bus possède une file d’attente de lettres mortes (DQL) associée. Le système déplace automatiquement les messages qu’il ne peut pas remettre ou traiter vers la DLQ. Par exemple, le système déplace un message vers la DLQ lorsque le message dépasse le nombre maximal de remises ou sa durée de vie (TTL) expire.
Important
Pour déplacer les messages dont la durée de vie a expiré vers la DLQ, activez l’option dead-lettering on message expiration pour la file d’attente ou l’abonnement. Sans ce paramètre, le système ignore silencieusement les messages expirés. Pour connaître les étapes de configuration, consultez Activer la lettre morte pour une file d’attente ou un abonnement.
Dans JMS, vous accédez au DLQ en tant que destination distincte en construisant le chemin complet et en créant un JmsQueue en utilisant celui-ci. Aucune API spéciale n’est requise.
Format de chemin DLQ de file d’attente :
<queue-name>/$deadletterqueue
Format du chemin de la DLQ pour un abonnement à un topic :
<topic-name>/Subscriptions/<subscription-name>/$deadletterqueue
Exemple - consommation depuis la file d’attente de lettres mortes d’une file d’attente :
import org.apache.qpid.jms.JmsQueue;
// Construct the DLQ path for a queue named "orders"
String dlqPath = "orders/$deadletterqueue";
JmsQueue dlqDestination = new JmsQueue(dlqPath);
// Create a consumer on the DLQ and receive messages
MessageConsumer dlqConsumer = session.createConsumer(dlqDestination);
Message message = dlqConsumer.receive(5000);
Les messages à lettres mortes incluent des propriétés de métadonnées qui décrivent pourquoi le message a été mis en lettres mortes :
| Propriété | Description |
|---|---|
DeadLetterReason |
Raison pour laquelle le message a été mis en lettres mortes (par exemple, TTLExpiredException ou MaxDeliveryCountExceeded). |
DeadLetterErrorDescription |
Description lisible par un humain de la raison de mise en lettres mortes. |
Lisez ces propriétés à l’aide de message.getStringProperty():
String reason = message.getStringProperty("DeadLetterReason");
String description = message.getStringProperty("DeadLetterErrorDescription");
Pour obtenir un exemple de travail complet, consultez QueueDeadLetterReceive.java dans le référentiel azure-servicebus-jms-samples.
Mappage entre une disposition AMQP et une opération Service Bus
Voici comment une disposition AMQP se traduit par une opération Service Bus :
ACCEPTED = 1; -> Complete()
REJECTED = 2; -> DeadLetter()
RELEASED = 3; (just unlock the message in service bus, will then get redelivered)
MODIFIED_FAILED = 4; -> Abandon() which increases delivery count
MODIFIED_FAILED_UNDELIVERABLE = 5; -> Defer()
Résumé
Ce guide de développement montre comment Java applications clientes qui utilisent Java Message Service (JMS) peuvent se connecter à Azure Service Bus.
Étapes suivantes
Pour plus d’informations sur Azure Service Bus et des détails sur les entités Java Message Service (JMS), consultez les articles suivants :
- Choose entre JMS et le SDK natif pour Azure Service Bus
- Service Bus - Files d’attente, rubriques et abonnements
- Service Bus – Entités Java Message Service
- Prise en charge d’AMQP 1.0 dans Azure Service Bus
- Guide du développeur sur l’utilisation de Service Bus avec AMQP 1.0
- Prise en main des files d’attente Service Bus
- API Java Message Service (documentation externe d'Oracle)
- Découvrez comment migrer d’ActiveMQ vers Service Bus