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.
Azure Service Bus est un service de messagerie cloud hautement fiable de Microsoft.
Utilisez la bibliothèque @azure/service-bus cliente dans votre application pour
- Envoyer des messages à une file d’attente ou à une rubrique Azure Service Bus
- Recevoir des messages à partir d’une file d’attente ou d’un abonnement Azure Service Bus
- Créez/Obtenez/Supprimez/Mettez à jour/Listez les files d’attente/Rubriques/Abonnements/Règles dans un espace de noms Azure Service Bus.
Ressources pour @azure/service-bus la version 7 :
Liens clés :
- Code source
- Paquet (npm)
- Documentation de référence de l’API
- Documentation du produit
- Échantillons
- Guide de résolution des problèmes
REMARQUE : Si vous utilisez la version 1.1.10 ou une version antérieure et que vous souhaitez migrer vers la dernière version de ce package, consultez notre guide de migration pour passer de Service Bus V1 à Service Bus V7
Premiers pas
Installer le package
Installez la dernière version de la bibliothèque cliente Azure Service Bus à l’aide de npm.
npm install @azure/service-bus
Environnements actuellement pris en charge
Prérequis
Configurer TypeScript
Les utilisateurs TypeScript doivent avoir installé les définitions de type Node :
npm install @types/node
Vous devez également activer compilerOptions.allowSyntheticDefaultImports dans votre tsconfig.json. Notez que si vous avez activé compilerOptions.esModuleInterop, allowSyntheticDefaultImports est activé par défaut. Pour plus d’informations, consultez manuel des options du compilateur de TypeScript.
Offre groupée JavaScript
Pour utiliser cette bibliothèque cliente dans le navigateur, vous devez d’abord utiliser un bundler. Pour plus d’informations sur la procédure à suivre, reportez-vous à notre documentation de regroupement .
Outre ce qui est décrit ici, cette bibliothèque a également besoin de polyfills supplémentaires pour les modules intégrés NodeJS suivants afin de fonctionner correctement dans les navigateurs :
bufferospathprocess
Regroupement avec Webpack
Si vous utilisez Webpack v5, vous pouvez installer les dépendances de développement suivantes
npm install --save-dev os-browserify path-browserify
ajoutez ensuite ce qui suit dans votre webpack.config.js
const path = require("path");
+const webpack = require("webpack");
module.exports = {
entry: "./src/index.ts",
@@ -12,8 +13,21 @@ module.exports = {
},
],
},
+ plugins: [
+ new webpack.ProvidePlugin({
+ process: "process/browser",
+ }),
+ new webpack.ProvidePlugin({
+ Buffer: ["buffer", "Buffer"],
+ }),
+ ],
resolve: {
extensions: [".ts", ".js"],
+ fallback: {
+ buffer: require.resolve("buffer/"),
+ os: require.resolve("os-browserify"),
+ path: require.resolve("path-browserify"),
+ },
},
Regroupement avec rollup
Si vous utilisez rollup bundler, installez les dépendances de développement suivantes
npm install --save-dev @rollup/plugin-commonjs @rollup/plugin-inject @rollup/plugin-node-resolve
Incluez ensuite ce qui suit dans votre rollup.config.js
+import nodeResolve from "@rollup/plugin-node-resolve";
+import cjs from "@rollup/plugin-commonjs";
+import shim from "rollup-plugin-shim";
+import inject from "@rollup/plugin-inject";
export default {
// other configs
plugins: [
+ shim({
+ fs: `export default {}`,
+ net: `export default {}`,
+ tls: `export default {}`,
+ path: `export default {}`,
+ dns: `export function resolve() { }`,
+ }),
+ nodeResolve({
+ mainFields: ["module", "browser"],
+ preferBuiltins: false,
+ }),
+ cjs(),
+ inject({
+ modules: {
+ Buffer: ["buffer", "Buffer"],
+ process: "process",
+ },
+ exclude: ["./**/package.json"],
+ }),
]
};
Pour plus d’informations sur l’utilisation de polyfills, consultez la documentation de votre bundler favori.
Prise en charge de React Native
À l’instar des navigateurs, React Native ne prend pas en charge certaines API JavaScript utilisées par cette bibliothèque SDK, vous devez donc leur fournir des polyfills. Pour plus d’informations, consultez l’exemple Messaging React Native avec Expo.
Authentifier le client
L’interaction avec Service Bus commence avec une instance de la classe ServiceBusClient . Vous pouvez vous authentifier auprès de Service Bus à l’aide d’une chaîne de connexion ou d’informations d’identification Azure Active Directory.
Utilisation d’une chaîne de connexion
Cette méthode transfère la chaîne de connexion à votre instance Service Bus. Vous pouvez obtenir la chaîne de connexion à partir du portail Azure.
import { ServiceBusClient } from "@azure/service-bus";
const serviceBusClient = new ServiceBusClient("<connectionString>");
Plus d’informations sur ce constructeur sont disponibles dans la documentation de l’API.
Utilisation d’informations d’identification Azure Active Directory
L’authentification avec Azure Active Directory utilise la bibliothèque Azure Identity.
L’exemple ci-dessous utilise DefaultAzureCredential, l’un des nombreux fournisseurs d’informations d’identification disponibles dans la @azure/identity bibliothèque.
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
REMARQUE : Si vous utilisez votre propre implémentation de l’interface
TokenCredentialcontre AAD, définissez les « scopes » pour service-bus sur ce qui suit pour obtenir le jeton approprié :
["https://servicebus.azure.net//user_impersonation"];
Plus d’informations sur ce constructeur sont disponibles dans la documentation de l’API
Concepts clés
Une fois que vous avez initialisé un ServiceBusClient, vous pouvez interagir avec ces ressources dans un espace de noms Service Bus :
- Files d’attente : permet d’envoyer et de recevoir des messages. Souvent utilisé pour la communication point à point.
- Rubriques : contrairement aux files d’attente, les rubriques sont mieux adaptées aux scénarios de publication/abonnement. Une rubrique peut être envoyée, mais nécessite un abonnement, qui peut être plusieurs en parallèle, pour être consommé.
- Abonnements : mécanisme de consommation à partir d’une rubrique. Chaque abonnement est indépendant et reçoit une copie de chaque message envoyé à la rubrique. Les règles et les filtres peuvent être utilisés pour personnaliser les messages reçus par un abonnement spécifique.
Pour plus d’informations sur ces ressources, consultez Qu’est-ce qu’Azure Service Bus ?.
Pour interagir avec ces ressources, il faut connaître les concepts SDK suivants :
- Envoyez des messages, à une file d’attente ou à une rubrique, à l’aide d’un
ServiceBusSenderServiceBusClient.createSender()fichier . - Recevez des messages, à partir d’une file d’attente ou d’un abonnement, à l’aide d’un
ServiceBusReceiverfichierServiceBusClient.createReceiver(). - Recevez des messages, à partir de files d’attente ou d’abonnements activés pour les sessions, à l’aide d’un fichier créé à l’aide
ServiceBusSessionReceiverdeServiceBusClient.acceptSession()ouServiceBusClient.acceptNextSession().
Veuillez noter que les files d’attente, les rubriques et les abonnements doivent être créés avant d’utiliser cette bibliothèque.
Examples
Les sections suivantes fournissent des extraits de code qui couvrent certaines des tâches courantes à l’aide d’Azure Service Bus
- Envoyer des messages
- Recevoir des messages
- Régler un message
- Files d’attente de lettres mortes
- Envoyer des messages à l’aide de Sessions
- Recevoir des messages des sessions
- Liste des sessions de messages
- Gérer les ressources d’un espace de noms Service Bus
- Exemples supplémentaires
Envoyer des messages
Une fois que vous avez créé une instance d’une ServiceBusClient classe, vous pouvez obtenir une ServiceBusSender méthode createSender que vous pouvez utiliser pour envoyer des messages.
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
const sender = serviceBusClient.createSender("my-queue");
const messages = [
{ body: "Albert Einstein" },
{ body: "Werner Heisenberg" },
{ body: "Marie Curie" },
{ body: "Steven Hawking" },
{ body: "Isaac Newton" },
{ body: "Niels Bohr" },
{ body: "Michael Faraday" },
{ body: "Galileo Galilei" },
{ body: "Johannes Kepler" },
{ body: "Nikolaus Kopernikus" },
];
// sending a single message
await sender.sendMessages(messages[0]);
// sending multiple messages in a single call
// this will fail if the messages cannot fit in a batch
await sender.sendMessages(messages);
// Sends multiple messages using one or more ServiceBusMessageBatch objects as required
let batch = await sender.createMessageBatch();
for (let i = 0; i < messages.length; i++) {
const message = messages[i];
if (!batch.tryAddMessage(message)) {
// Send the current batch as it is full and create a new one
await sender.sendMessages(batch);
batch = await sender.createMessageBatch();
if (!batch.tryAddMessage(messages[i])) {
throw new Error("Message too big to fit in a batch");
}
}
}
// Send the batch
await sender.sendMessages(batch);
Recevoir des messages
Une fois que vous avez créé une instance d’une ServiceBusClient classe, vous pouvez obtenir une à l’aide de ServiceBusReceiver la méthode createReceiver .
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
const receiver = serviceBusClient.createReceiver("my-queue");
Il y a deux receiveModes disponibles.
- « peekLock » - En mode peekLock, le récepteur a un verrou sur le message pour la durée spécifiée dans la file d’attente.
- « receiveAndDelete » : en mode receiveAndDelete, les messages sont supprimés de Service Bus au fur et à mesure de leur réception.
Si le mode receiveMode n’est pas fourni dans les options, il passe par défaut au mode « peekLock ». Vous pouvez également régler les messages reçus en mode « peekLock ».
Vous pouvez utiliser ce récepteur de l’une des 3 manières suivantes pour recevoir des messages :
Obtenir un éventail de messages
Utilisez la fonction receiveMessages qui renvoie une promesse qui se résout en un tableau de messages.
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
const receiver = serviceBusClient.createReceiver("my-queue");
const myMessages = await receiver.receiveMessages(10);
S’abonner à l’aide d’un gestionnaire de messages
Utilisez la méthode subscribe pour configurer des gestionnaires de messages et les faire fonctionner aussi longtemps que nécessaire.
Lorsque vous avez terminé, appelez receiver.close() pour ne plus recevoir de messages.
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
const receiver = serviceBusClient.createReceiver("my-queue");
const myMessageHandler = async (message) => {
// your code here
console.log(`message.body: ${message.body}`);
};
const myErrorHandler = async (args) => {
console.log(
`Error occurred with ${args.entityPath} within ${args.fullyQualifiedNamespace}: `,
args.error,
);
};
receiver.subscribe({
processMessage: myMessageHandler,
processError: myErrorHandler,
});
Utiliser un itérateur asynchrone
Utilisez getMessageIterator pour obtenir un itérateur asynchrone sur les messages
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
const receiver = serviceBusClient.createReceiver("my-queue");
for await (const message of receiver.getMessageIterator()) {
// your code here
}
Régler un message
Une fois que vous avez reçu un message, vous pouvez appeler completeMessage(), abandonMessage()ou deferMessage()deadLetterMessage() sur le récepteur en fonction de la façon dont vous souhaitez régler le message.
Pour en savoir plus, veuillez lire Règlement des messages reçus
Files d’attente de lettres mortes
La file d’attente de lettres mortes est une sous-file d’attente. Chaque file d’attente ou abonnement a sa propre file d’attente de lettres mortes. Les files d’attente de lettres mortes stockent les messages qui ont été explicitement mis en lettres mortes (via receiver.deadLetterMessage()) ou les messages qui ont dépassé leur nombre maximal de remises
La création d’un récepteur pour une sous-file d’attente de lettres mortes est similaire à la création d’un récepteur pour un abonnement ou une file d’attente :
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
// To receive from a queue's dead letter sub-queue
const deadLetterReceiverForQueue = serviceBusClient.createReceiver("queue", {
subQueueType: "deadLetter",
});
// To receive from a subscription's dead letter sub-queue
const deadLetterReceiverForSubscription = serviceBusClient.createReceiver("topic", "subscription", {
subQueueType: "deadLetter",
});
// Dead letter receivers work like any other receiver connected to a queue
// ex:
const messages = await deadLetterReceiverForQueue.receiveMessages(5);
for (const message of messages) {
console.log(`Dead lettered message: ${message.body}`);
}
Des exemples complets illustrant plus en détail les files d’attente de lettres mortes :
- Utilisation de receiver.deadLetterMessage() pour envoyer explicitement des messages à la sous-file d’attente de lettres mortes
- Réception de messages de la sous-file d’attente de lettres mortes
Envoyer des messages à l’aide de Sessions
L’utilisation de sessions nécessite la création d’une file d’attente ou d’un abonnement activé pour les sessions. Vous pouvez en savoir plus sur la configuration de cette fonctionnalité dans le portail ici.
Pour envoyer des messages à une session, utilisez le ServiceBusClient pour créer un expéditeur à l’aide de createSender.
Lors de l’envoi du message, définissez la propriété dans le sessionId message pour vous assurer que votre message arrive dans la bonne session.
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
const sender = serviceBusClient.createSender("my-session-queue");
await sender.sendMessages({
body: "my-message-body",
sessionId: "my-session",
});
Vous pouvez en savoir plus sur le fonctionnement des sessions ici.
Recevoir des messages des sessions
L’utilisation de sessions nécessite la création d’une file d’attente ou d’un abonnement activé pour les sessions. Vous pouvez en savoir plus sur la configuration de cette fonctionnalité dans le portail ici.
Contrairement aux files d’attente ou aux abonnements non activés pour les sessions, un seul récepteur peut lire à partir d’une session à tout moment. Ceci est appliqué par le verrouillage d’une session, qui est gérée par Service Bus. D’un point de vue conceptuel, cela est similaire à la façon dont le verrouillage des messages fonctionne lors de l’utilisation peekLock du mode : lorsqu’un message (ou une session) est verrouillé, votre destinataire y a un accès exclusif.
Pour ouvrir et verrouiller une session, utilisez une instance de ServiceBusClient pour créer un SessionReceiver.
Il y a deux façons de choisir la session à ouvrir :
Spécifiez un
sessionId, qui verrouille une session nommée.const receiver = await serviceBusClient.acceptSession("my-session-queue", "my-session");Ne spécifiez pas d’ID de session. Dans ce cas, Service Bus trouvera la prochaine session disponible qui n’est pas déjà verrouillée.
const receiver = await serviceBusClient.acceptNextSession("my-session-queue");Vous pouvez trouver le nom de la session via la
sessionIdpropriété sur leSessionReceiver. Si le mode receiveMode n’est pas fourni dans les options, il passe par défaut au mode « peekLock ». Vous pouvez également régler les messages reçus en mode « peekLock ».
Une fois le récepteur créé, vous pouvez choisir entre 3 façons de recevoir des messages :
- Obtenir un éventail de messages
- S’abonner à l’aide d’un gestionnaire de messages
- Utiliser un itérateur asynchrone
Vous pouvez en savoir plus sur le fonctionnement des sessions ici.
Liste des sessions de messages
Pour découvrir quelles sessions ont des messages actifs ou un état de session dans une file d’attente ou un abonnement, utilisez listMessageSessions():
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
// List all sessions with active messages or session state in a queue
for await (const sessionId of serviceBusClient.listMessageSessions("my-session-queue")) {
console.log("Session ID:", sessionId);
}
// List sessions in a subscription
for await (const sessionId of serviceBusClient.listMessageSessions("my-topic", "my-subscription")) {
console.log("Session ID:", sessionId);
}
// List only sessions whose stored session state was set or updated in the last seven days
const sessionStateUpdatedAfter = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
for await (const sessionId of serviceBusClient.listMessageSessions("my-session-queue", {
sessionStateUpdatedAfter,
})) {
console.log("Recently updated session ID:", sessionId);
}
Gérer les ressources d’un espace de noms Service Bus
ServiceBusAdministrationClient permet de gérer un espace de noms avec des opérations CRUD sur les entités (files d’attente, rubriques et abonnements) et sur les règles d’un abonnement.
- Prend en charge l’authentification à l’aide d’une chaîne de connexion Service Bus ainsi qu’à l’aide des informations d’identification AAD d’un
@azure/identitytype similaire à .ServiceBusClient
Remarque : Service Bus ne prend pas encore en charge la définition de règles CORS pour les espaces de noms, et ne fonctionnera donc ServiceBusAdministrationClient pas dans le navigateur sans désactiver la sécurité web. Pour plus d’informations, cliquez ici.
import { ServiceBusAdministrationClient } from "@azure/service-bus";
const queueName = "my-session-queue";
// Get the connection string from the portal
// OR
// use the token credential overload, provide the host name of your Service Bus instance and the AAD credentials from the @azure/identity library
const serviceBusAdministrationClient = new ServiceBusAdministrationClient("<connectionString>");
// Similarly, you can create topics and subscriptions as well.
const createQueueResponse = await serviceBusAdministrationClient.createQueue(queueName);
console.log("Created queue with name - ", createQueueResponse.name);
const queueRuntimeProperties =
await serviceBusAdministrationClient.getQueueRuntimeProperties(queueName);
console.log(`Number of messages in the queue = ${queueRuntimeProperties.totalMessageCount}`);
// Topic runtime properties additionally report the total number of SQL and correlation filters
// across all of the topic's subscriptions. These counts are served by the 2024-05 service API
// version and later; on an older version they are `undefined`.
const topicName = "my-topic";
const subscriptionName = "my-subscription";
await serviceBusAdministrationClient.createTopic(topicName);
// A new subscription carries a default rule with a SQL TrueFilter. Adding a correlation rule
// gives the topic one of each, so the counts below aggregate across the subscription's rules.
await serviceBusAdministrationClient.createSubscription(topicName, subscriptionName);
await serviceBusAdministrationClient.createRule(
topicName,
subscriptionName,
"my-correlation-rule",
{ correlationId: "my-correlation-id" },
);
const topicRuntimeProperties =
await serviceBusAdministrationClient.getTopicRuntimeProperties(topicName);
console.log(`SQL filter count = ${topicRuntimeProperties.sqlFilterCount}`);
console.log(`Correlation filter count = ${topicRuntimeProperties.correlationFilterCount}`);
await serviceBusAdministrationClient.deleteTopic(topicName);
await serviceBusAdministrationClient.deleteQueue(queueName);
- Echantillon de référence - administrationClient.ts
Troubleshooting
Voici quelques étapes initiales pour commencer à diagnostiquer les problèmes. Pour plus d’informations, reportez-vous au Guide de dépannage de Service Bus.
Dépendances AMQP
La bibliothèque Service Bus dépend de la bibliothèque rhea-promise pour la gestion des connexions, l’envoi et la réception de messages via le protocole AMQP .
Logging
Vous pouvez définir la variable d’environnement suivante pour obtenir les journaux de débogage lors de l’utilisation de cette bibliothèque.
- Obtention des journaux de débogage à partir du Kit de développement logiciel (SDK) Service Bus
export DEBUG=azure*
- Obtention des journaux de débogage à partir du Kit de développement logiciel (SDK) Service Bus et de la bibliothèque au niveau du protocole.
export DEBUG=azure*,rhea*
- Si vous n’êtes pas intéressé par l’affichage de la transformation du message (qui consomme beaucoup d’espace console/disque), vous pouvez définir la variable d’environnement
DEBUGcomme suit :
export DEBUG=azure*,rhea*,-rhea:raw,-rhea:message,-azure:core-amqp:datatransformer
- Si vous ne vous intéressez qu’aux erreurs, vous pouvez définir la variable d’environnement
DEBUGcomme suit :
export DEBUG=azure:service-bus:error,azure:core-amqp:error,rhea-promise:error,rhea:events,rhea:frames,rhea:io,rhea:flow
Enregistrement dans un fichier
- Définissez la variable d’environnement
DEBUGcomme indiqué ci-dessus - Exécutez votre script de test comme suit :
- Les instructions de journalisation de votre script de test vont à
out.loget les instructions de journalisation du kit sdk sontdebug.log.node your-test-script.js > out.log 2>debug.log - Les instructions de journalisation à partir de votre script de test et du kit sdk accédent au même fichier
out.logen redirigeant stderr vers stdout (&1), puis redirigez stdout vers un fichier :node your-test-script.js >out.log 2>&1 - Journalisation des instructions à partir de votre script de test et du kit sdk accédez au même fichier
out.log.node your-test-script.js &> out.log
Étapes suivantes
Jetez un coup d’œil au répertoire d’exemples pour obtenir des exemples détaillés sur l’utilisation de cette bibliothèque pour envoyer et recevoir des messages vers/depuis les files d’attente, les rubriques et les abonnements Service Bus.
Contributing
Si vous souhaitez contribuer à cette bibliothèque, veuillez lire le guide contribution pour en savoir plus sur la construction et le test du code.
Azure SDK for JavaScript