Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il bus di servizio di Azure è un servizio di messaggistica cloud altamente affidabile di Microsoft.
Utilizzare la libreria @azure/service-bus client nell'applicazione per
- Inviare messaggi a una coda o a un argomento del bus di servizio di Azure
- Ricevere messaggi da una coda o da una sottoscrizione del bus di servizio di Azure
- Creare/Ottenere/Eliminare/Aggiornare/Elencare code/argomenti/sottoscrizioni/regole in uno spazio dei nomi del bus di servizio di Azure.
Risorse per @azure/service-bus la versione 7:
Collegamenti chiave:
- Codice sorgente
- Pacchetto (npm)
- documentazione di riferimento dell'API
- Documentazione del prodotto
- esempi di
- Guida alla risoluzione dei problemi
NOTA: se si usa la versione 1.1.10 o precedente e si vuole eseguire la migrazione alla versione più recente di questo pacchetto, vedere la guida alla migrazione per passare dal bus di servizio V1 al bus di servizio V7
Come iniziare
Installare il pacchetto
Installare la versione più recente per la libreria client del bus di servizio di Azure usando npm.
npm install @azure/service-bus
Ambienti attualmente supportati
Prerequisites
Configurare TypeScript
Gli utenti typeScript devono avere installate definizioni dei tipi di nodo:
npm install @types/node
È anche necessario abilitare compilerOptions.allowSyntheticDefaultImports nel tsconfig.json. Si noti che se è stato abilitato compilerOptions.esModuleInterop, allowSyntheticDefaultImports è abilitato per impostazione predefinita. Per altre informazioni, vedere manuale delle opzioni del compilatore di TypeScript di
Pacchetto JavaScript
Per usare questa libreria client nel browser, è prima necessario usare un bundler. Per informazioni dettagliate su come eseguire questa operazione, vedere la documentazione di creazione di bundle .
Oltre a quanto descritto in questa libreria, questa libreria richiede anche ulteriori polyfill per i moduli predefiniti nodeJS seguenti per funzionare correttamente nei browser:
bufferospathprocess
Creazione di bundle con Webpack
Se si usa Webpack v5, è possibile installare le dipendenze di sviluppo seguenti
npm install --save-dev os-browserify path-browserify
aggiungere quindi il codice seguente nel 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"),
+ },
},
Creazione di bundle con rollup
Se si usa Rollup bundler, installare le dipendenze di sviluppo seguenti
npm install --save-dev @rollup/plugin-commonjs @rollup/plugin-inject @rollup/plugin-node-resolve
Includere quindi quanto segue nel 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"],
+ }),
]
};
Per altre informazioni sull'uso di polyfill, consultare la documentazione del bundler preferito.
Supporto nativo React
Simile ai browser, React Native non supporta alcune API JavaScript utilizzate da questa libreria SDK, quindi è necessario fornire polyfill per loro. Per altre informazioni, vedere l'esempio react nativo di messaggistica con Expo.
Autenticare il client
L'interazione con il bus di servizio inizia con un'istanza della classe ServiceBusClient . È possibile eseguire l'autenticazione al bus di servizio usando una stringa di connessione o una credenziale di Azure Active Directory.
Uso di una stringa di connessione
Questo metodo accetta la stringa di connessione nell'istanza di bus di servizio. È possibile ottenere la stringa di connessione dal portale di Azure.
import { ServiceBusClient } from "@azure/service-bus";
const serviceBusClient = new ServiceBusClient("<connectionString>");
Altre informazioni su questo costruttore sono disponibili nella documentazione dell'API.
Uso di credenziali di Azure Active Directory
L'autenticazione con Azure Active Directory usa la libreria di identità di Azure.
Nell'esempio seguente viene usato DefaultAzureCredential, uno dei numerosi provider di credenziali disponibili nella @azure/identity libreria.
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);
NOTA: se si usa un'implementazione personalizzata dell'interfaccia
TokenCredentialcon AAD, impostare gli "ambiti" per il bus di servizio su quanto segue per ottenere il token appropriato:
["https://servicebus.azure.net//user_impersonation"];
Altre informazioni su questo costruttore sono disponibili nella documentazione dell'API
Concetti chiave
Dopo aver inizializzato un ServiceBusClient, è possibile interagire con queste risorse all'interno di uno spazio dei nomi del bus di servizio:
- Code: consente l'invio e la ricezione di messaggi. Spesso utilizzato per la comunicazione punto-punto.
- Argomenti: a differenza delle code, gli argomenti sono più adatti per gli scenari di pubblicazione/sottoscrizione. Un argomento può essere inviato a, ma richiede una sottoscrizione, di cui possono essere presenti più sottoscrizioni in parallelo, da cui utilizzare.
- Sottoscrizioni: meccanismo da utilizzare da un argomento. Ogni sottoscrizione è indipendente e riceve una copia di ogni messaggio inviato all'argomento. Le regole e i filtri possono essere utilizzati per personalizzare i messaggi ricevuti da una sottoscrizione specifica.
Per altre informazioni su queste risorse, vedere Che cos'è il bus di servizio di Azure?.
Per interagire con queste risorse, è necessario avere familiarità con i seguenti concetti SDK:
- Inviare messaggi a una coda o a un argomento utilizzando un
ServiceBusSenderServiceBusClient.createSender()file . - Ricevere messaggi, da una coda o da una sottoscrizione, utilizzando un
ServiceBusReceiverfile .ServiceBusClient.createReceiver() - Ricevere messaggi, da code o sottoscrizioni abilitate per la sessione, utilizzando un
ServiceBusSessionReceivermetodo creato utilizzandoServiceBusClient.acceptSession()oServiceBusClient.acceptNextSession().
Si prega di notare che le code, gli argomenti e gli abbonamenti devono essere creati prima di utilizzare questa libreria.
Examples
Le sezioni seguenti forniscono frammenti di codice che illustrano alcune delle attività comuni con il bus di servizio di Azure
- Inviare messaggi
- Ricevere messaggi
- Liquidare un messaggio
- Code di messaggi non recapitabili
- Inviare messaggi utilizzando le sessioni
- Ricevere messaggi dalle sessioni
- Elenco delle sessioni di messaggi
- Gestire le risorse di uno spazio dei nomi di Service Bus
- Altri esempi
Inviare messaggi
Dopo aver creato un'istanza di una ServiceBusClient classe, è possibile ottenere un ServiceBusSender utilizzando il metodo createSender che è possibile utilizzare per inviare messaggi.
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);
Ricevere messaggi
Dopo aver creato un'istanza di una ServiceBusClient classe, è possibile ottenere un ServiceBusReceiver utilizzando il metodo 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");
Ci sono due receiveModes disponibili.
- "peekLock": in modalità peekLock, il ricevitore ha un blocco sul messaggio per la durata specificata nella coda.
- "receiveAndDelete": in modalità receiveAndDelete, i messaggi vengono eliminati dal bus di servizio non appena vengono ricevuti.
Se receiveMode non è fornito nelle opzioni, per impostazione predefinita viene utilizzata la modalità "peekLock". È inoltre possibile liquidare i messaggi ricevuti in modalità "peekLock".
È possibile utilizzare questo ricevitore in uno dei 3 modi per ricevere messaggi:
Ricevere una matrice di messaggi
Utilizzare la funzione receiveMessages che restituisce una promessa che si risolve in una matrice di messaggi.
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);
Sottoscrivere utilizzando un gestore di messaggi
Utilizzare il metodo subscribe per configurare i gestori dei messaggi e farlo funzionare per tutto il tempo necessario.
Al termine, chiama receiver.close() per interrompere la ricezione di altri messaggi.
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,
});
Usare l'iteratore asincrono
Utilizzare getMessageIterator per ottenere un iteratore asincrono sui messaggi
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
}
Liquidare un messaggio
Una volta ricevuto un messaggio, è possibile chiamare completeMessage(), abandonMessage(), deferMessage() o deadLetterMessage() sul ricevitore in base a come si desidera risolvere il messaggio.
Per saperne di più, leggi Liquidazione dei messaggi ricevuti
Code dei messaggi non consegnati
La coda dei messaggi non recapitabili è una coda secondaria. Ogni coda o sottoscrizione dispone di una propria coda di messaggi non recapitabili. Le code di messaggi non recapitabili archiviano i messaggi che sono stati esplicitamente messaggi non recapitabili (tramite receiver.deadLetterMessage()) o i messaggi che hanno superato il numero massimo di recapiti.
La creazione di un ricevitore per una coda secondaria di messaggi non recapitabili è simile alla creazione di un ricevitore per una sottoscrizione o una coda:
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}`);
}
Esempi completi che illustrano le code di messaggi non recapitabili in modo più approfondito:
- Utilizzo di receiver.deadLetterMessage() per inviare esplicitamente messaggi alla coda secondaria dei messaggi non recapitabili
- Ricezione di messaggi dalla coda secondaria dei messaggi non recapitabili
Inviare messaggi utilizzando le sessioni
L'utilizzo delle sessioni richiede la creazione di una coda o di una sottoscrizione abilitata per la sessione. Per altre informazioni su come configurare questa funzione, vedere il portale qui.
Per inviare messaggi a una sessione, utilizzare per ServiceBusClient creare un mittente utilizzando createSender.
Quando si invia il messaggio, impostare la sessionId proprietà nel messaggio per assicurarsi che il messaggio arrivi nella sessione corretta.
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",
});
Per saperne di più su come funzionano le sessioni, clicca qui.
Ricevere messaggi dalle sessioni
L'utilizzo delle sessioni richiede la creazione di una coda o di una sottoscrizione abilitata per la sessione. Per altre informazioni su come configurare questa funzione, vedere il portale qui.
A differenza delle code o delle sottoscrizioni non abilitate per la sessione, solo un singolo ricevitore può leggere da una sessione in qualsiasi momento. Questa operazione viene applicata bloccando una sessione, che viene gestita dal bus di servizio. Concettualmente, questo è simile a come funziona il blocco dei messaggi quando si utilizza peekLock la modalità: quando un messaggio (o una sessione) è bloccato, il destinatario ha accesso esclusivo ad esso.
Per aprire e bloccare una sessione, utilizzare un'istanza di ServiceBusClient per creare un oggetto SessionReceiver.
Ci sono due modi per scegliere quale sessione aprire:
Specificare un valore ,
sessionIdche blocca una sessione denominata.const receiver = await serviceBusClient.acceptSession("my-session-queue", "my-session");Non specificare un ID sessione. In questo caso, il bus di servizio troverà la successiva sessione disponibile che non è già bloccata.
const receiver = await serviceBusClient.acceptNextSession("my-session-queue");È possibile trovare il nome della sessione tramite la
sessionIdproprietà inSessionReceiver. Se receiveMode non è fornito nelle opzioni, per impostazione predefinita viene utilizzata la modalità "peekLock". È inoltre possibile liquidare i messaggi ricevuti in modalità "peekLock".
Una volta creato il ricevitore, è possibile scegliere tra 3 modi per ricevere i messaggi:
- Ricevere una matrice di messaggi
- Sottoscrivere utilizzando un gestore di messaggi
- Usare l'iteratore asincrono
Per saperne di più su come funzionano le sessioni, clicca qui.
Elenco delle sessioni di messaggi
Per scoprire quali sessioni hanno messaggi attivi o stato di sessione in una coda o in un abbonamento, usa 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);
}
Gestire le risorse di uno spazio dei nomi di Service Bus
ServiceBusAdministrationClient consente di gestire uno spazio dei nomi con operazioni CRUD sulle entità (code, argomenti e sottoscrizioni) e sulle regole di una sottoscrizione.
- Supporta l'autenticazione con una stringa di connessione del bus di servizio e con le credenziali
@azure/identityAAD di un modello simile aServiceBusClient.
Nota: il bus di servizio non supporta ancora l'impostazione delle regole CORS per gli spazi dei nomi, quindi ServiceBusAdministrationClient non funzionerà nel browser senza disabilitare la sicurezza Web. Per maggiori informazioni, fai riferimento qui.
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);
- Esempio di riferimento - administrationClient.ts
Troubleshooting
Di seguito sono riportati alcuni passaggi iniziali per iniziare a diagnosticare i problemi. Per altre informazioni, vedere la Guida alla risoluzione dei problemi di bus di servizio.
Dipendenze AMQP
La libreria del bus di servizio dipende dalla libreria rhea-promise per la gestione delle connessioni, l'invio e la ricezione di messaggi tramite il protocollo AMQP .
Logging
È possibile impostare la variabile di ambiente seguente per ottenere i log di debug quando si usa questa libreria.
- Recupero dei log di debug da bus di servizio SDK
export DEBUG=azure*
- Recupero dei log di debug da bus di servizio SDK e dalla libreria a livello di protocollo.
export DEBUG=azure*,rhea*
- Se non si è interessati a visualizzare la trasformazione del messaggio (che consuma molto spazio su console/disco), è possibile impostare la
DEBUGvariabile di ambiente come segue:
export DEBUG=azure*,rhea*,-rhea:raw,-rhea:message,-azure:core-amqp:datatransformer
- Se si è interessati solo agli errori, è possibile impostare la variabile d'ambiente
DEBUGcome segue:
export DEBUG=azure:service-bus:error,azure:core-amqp:error,rhea-promise:error,rhea:events,rhea:frames,rhea:io,rhea:flow
Registrazione in un file
- Imposta la variabile d'ambiente
DEBUGcome mostrato sopra - Eseguire lo script di test come indicato di seguito:
- Le istruzioni di registrazione dallo script di test passano a
out.loge alle istruzioni di registrazione dall'SDK passano adebug.log.node your-test-script.js > out.log 2>debug.log - Le istruzioni di registrazione dallo script di test e l'SDK passano allo stesso file
out.logreindirizzando stderr a stdout (&1) e quindi reindirizzare stdout a un file:node your-test-script.js >out.log 2>&1 - Le istruzioni di registrazione dallo script di test e l'SDK passano allo stesso file
out.log.node your-test-script.js &> out.log
Passaggi successivi
Per esempi dettagliati su come usare questa libreria per inviare e ricevere messaggi da/verso code, argomenti e sottoscrizioni del bus di servizio.
Contributing
Se desideri contribuire a questa libreria, leggi la guida contributi per saperne di più su come costruire e testare il codice.
Azure SDK for JavaScript