biblioteca cliente de Azure Service Bus para JavaScript: versión 7.9.4
Azure Service Bus es un servicio de mensajería en la nube altamente confiable de Microsoft.
Uso de la biblioteca @azure/service-bus
cliente en la aplicación para
- Enviar mensajes a una cola o tema de Azure Service Bus
- Recepción de mensajes de una cola o suscripción de Azure Service Bus
- Create/Get/Delete/Update/List Queues/Topics/Subscriptions/Rules en un espacio de nombres de Azure Service Bus.
Recursos para la @azure/service-bus
versión 7:
Vínculos principales:
- Código fuente
- Paquete (npm)
- Documentación de referencia de API
- Documentación del producto
- Muestras
- Problemas al iniciar sesión en una aplicación que no es de la galería configurada para inicio de sesión único federado
NOTA: Si usa la versión 1.1.10 o inferior y desea migrar a la versión más reciente de este paquete, consulte nuestra guía de migración para pasar de Service Bus V1 a Service Bus V7.
Introducción
Instalar el paquete
Instale la versión más reciente de la biblioteca cliente de Azure Service Bus mediante npm.
npm install @azure/service-bus
Entornos admitidos actualmente
Requisitos previos
Configuración de TypeScript
Los usuarios de TypeScript deben tener instaladas definiciones de tipo node:
npm install @types/node
También debe habilitar compilerOptions.allowSyntheticDefaultImports
en la tsconfig.json. Tenga en cuenta que si ha habilitado compilerOptions.esModuleInterop
, allowSyntheticDefaultImports
está habilitado de forma predeterminada. Consulte el manual de opciones del compilador de TypeScript para obtener más información.
Paquete de JavaScript
Para usar esta biblioteca cliente en el explorador, primero debe usar un agrupador. Para más información sobre cómo hacerlo, consulte nuestra documentación de agrupación.
Además de lo que se describe allí, esta biblioteca también necesita polyfills adicionales para los siguientes módulos integrados de NodeJS core para funcionar correctamente en los exploradores:
buffer
os
path
process
Unión con Webpack
Si usa Webpack v5, puede instalar las siguientes dependencias de desarrollo.
npm install --save-dev os-browserify path-browserify
a continuación, agregue lo siguiente a la 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"),
+ },
},
Agrupación con acumulación
Si usa el empaquetador acumulativo, instale las siguientes dependencias de desarrollo.
npm install --save-dev @rollup/plugin-commonjs @rollup/plugin-inject @rollup/plugin-node-resolve
A continuación, incluya lo siguiente en el 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"],
+ }),
]
};
Consulte la documentación de su empaquetador favorito para obtener más información sobre el uso de polyfills.
compatibilidad con React Native
De forma similar a los exploradores, React Native no admite algunas API de JavaScript usadas por esta biblioteca del SDK, por lo que debe proporcionar polyfills para ellos. Consulte el ejemplo de mensajería React Native con Expo para obtener más detalles.
Autenticar el cliente
La interacción con Service Bus comienza con una instancia de la clase ServiceBusClient . Puede autenticarse en Service Bus mediante un cadena de conexión o mediante una credencial de Azure Active Directory.
Uso de un cadena de conexión
Este método toma el cadena de conexión a la instancia de Service Bus. Puede obtener la cadena de conexión de Azure Portal.
const { ServiceBusClient } = require("@azure/service-bus");
const serviceBusClient = new ServiceBusClient("<connectionString>");
Puede encontrar más información sobre este constructor en la documentación de la API.
Uso de una credencial de Azure Active Directory
La autenticación con Azure Active Directory usa la biblioteca de identidades de Azure.
En el ejemplo siguiente se usa DefaultAzureCredential, uno de los muchos proveedores de credenciales disponibles de la @azure/identity
biblioteca.
const { ServiceBusClient } = require("@azure/service-bus");
const { DefaultAzureCredential } = require("@azure/identity");
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
NOTA: Si usa su propia implementación de la
TokenCredential
interfaz en AAD, establezca los "ámbitos" para service-bus en lo siguiente para obtener el token adecuado:
["https://servicebus.azure.net//user_impersonation"];
Puede encontrar más información sobre este constructor en la documentación de la API.
Conceptos clave
Una vez que haya inicializado un ServiceBusClient
, puede interactuar con estos recursos dentro de un espacio de nombres de Service Bus:
- Colas: permite enviar y recibir mensajes. A menudo se usa para la comunicación de punto a punto.
- Temas: en lugar de las colas, los temas son más adecuados para escenarios de publicación o suscripción. Se puede enviar un tema a , pero requiere una suscripción, de la que puede haber varios en paralelo, para consumir.
- Suscripciones: mecanismo para consumir desde un tema. Cada suscripción es independiente y recibe una copia de cada mensaje enviado al tema. Las reglas y filtros se pueden usar para adaptar los mensajes que recibe una suscripción específica.
Para obtener más información sobre estos recursos, consulte ¿Qué es Azure Service Bus?.
Para interactuar con estos recursos, debe estar familiarizado con los siguientes conceptos del SDK:
- Envíe mensajes a una cola o tema mediante un
ServiceBusSender
objeto creado medianteServiceBusClient.createSender()
. - Reciba mensajes de una cola o una suscripción mediante un
ServiceBusReceiver
objeto creado medianteServiceBusClient.createReceiver()
. - Reciba mensajes de las colas o suscripciones habilitadas para la sesión mediante
ServiceBusSessionReceiver
ServiceBusClient.acceptSession()
oServiceBusClient.acceptNextSession()
.
Tenga en cuenta que las colas, temas y suscripciones deben crearse antes de usar esta biblioteca.
Ejemplos
En las secciones siguientes se proporcionan fragmentos de código que cubren algunas de las tareas comunes mediante Azure Service Bus
- Envío de mensajes
- Recepción de mensajes
- Liquidar un mensaje
- Colas de mensajes fallidos
- Envío de mensajes mediante sesiones
- Recibir mensajes de sesiones
- Administración de recursos de un espacio de nombres de Service Bus
- Ejemplos adicionales
Envío de mensajes
Una vez que haya creado una instancia de una ServiceBusClient
clase, puede obtener un ServiceBusSender
mediante el método createSender que puede usar para enviar mensajes.
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);
Recepción de mensajes
Una vez creada una instancia de una ServiceBusClient
clase, puede obtener un ServiceBusReceiver
mediante el método createReceiver .
const receiver = serviceBusClient.createReceiver("my-queue");
Hay dos receiveMode
disponibles.
- "peekLock": en el modo peekLock, el receptor tiene un bloqueo en el mensaje durante la duración especificada en la cola.
- "receiveAndDelete": en el modo receiveAndDelete, los mensajes se eliminan de Service Bus a medida que se reciben.
Si no se proporciona receiveMode en las opciones, el valor predeterminado es el modo "peekLock". También puede liquidar los mensajes recibidos en modo "peekLock".
Puede usar este receptor de una de tres maneras de recibir mensajes:
Obtener una matriz de mensajes
Use la función receiveMessages que devuelve una promesa que se resuelve en una matriz de mensajes.
const myMessages = await receiver.receiveMessages(10);
Suscribirse mediante un controlador de mensajes
Use el método subscribe para configurar controladores de mensajes y hacer que se ejecute siempre que necesite.
Cuando haya terminado, llame receiver.close()
a para dejar de recibir más mensajes.
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
});
Usar iterador asincrónico
Usar getMessageIterator para obtener un iterador asincrónico a través de mensajes
for await (let message of receiver.getMessageIterator()) {
// your code here
}
Liquidar un mensaje
Una vez que reciba un mensaje, puede llamar a completeMessage()
, abandonMessage()
deferMessage()
o deadLetterMessage()
en el receptor en función de cómo desea liquidar el mensaje.
Para más información, lea Establecer mensajes recibidos.
Colas de mensajes fallidos
La cola de mensajes fallidos es una sub cola. Cada cola o suscripción tiene su propia cola de mensajes fallidos. Las colas de mensajes fallidos almacenan mensajes enviados explícitamente (a través receiver.deadLetterMessage()
de ) o mensajes que han superado su número máximo de entregas.
La creación de un receptor para una sub cola de mensajes fallidos es similar a la creación de un receptor para una suscripción o cola:
// 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}`);
}
Ejemplos completos que muestran colas de mensajes fallidos más exhaustivamente:
- Uso de receiver.deadLetterMessage() para enviar explícitamente mensajes a la sub cola de mensajes fallidos
- Recepción de mensajes de la sub cola de mensajes fallidos
Envío de mensajes mediante sesiones
El uso de sesiones requiere que cree una cola o una suscripción habilitadas para la sesión. Puede obtener más información sobre cómo configurar esta característica en el portal aquí.
Para enviar mensajes a una sesión, use para ServiceBusClient
crear un remitente mediante createSender.
Al enviar el mensaje, establezca la sessionId
propiedad en el mensaje para asegurarse de que el mensaje llega a la sesión correcta.
const sender = serviceBusClient.createSender("my-session-queue");
await sender.sendMessages({
body: "my-message-body",
sessionId: "my-session"
});
Puede obtener más información sobre cómo funcionan las sesiones aquí.
Recibir mensajes de sesiones
El uso de sesiones requiere que cree una cola o una suscripción habilitadas para la sesión. Puede obtener más información sobre cómo configurar esta característica en el portal aquí.
A diferencia de las colas o suscripciones no habilitadas para sesión, solo un receptor puede leer desde una sesión en cualquier momento. Esto se aplica bloqueando una sesión, que se controla mediante Service Bus. Conceptualmente, esto es similar a cómo funciona el bloqueo de mensajes cuando se usa peekLock
el modo : cuando un mensaje (o sesión) está bloqueado, el receptor tiene acceso exclusivo a él.
Para abrir y bloquear una sesión, use una instancia de ServiceBusClient
para crear un SessionReceiver.
Hay dos maneras de elegir qué sesión abrir:
Especifique un
sessionId
objeto , que bloquea una sesión con nombre.const receiver = await serviceBusClient.acceptSession("my-session-queue", "my-session");
No especifique un identificador de sesión. En este caso, Service Bus encontrará la siguiente sesión disponible que aún no está bloqueada.
const receiver = await serviceBusClient.acceptNextSession("my-session-queue");
Puede encontrar el nombre de la sesión a través de la
sessionId
propiedad en .SessionReceiver
Si no se proporciona receiveMode en las opciones, el valor predeterminado es el modo "peekLock". También puede liquidar los mensajes recibidos en modo "peekLock".
Una vez creado el receptor, puede elegir entre tres maneras de recibir mensajes:
- Obtener una matriz de mensajes
- Suscribirse mediante un controlador de mensajes
- Usar iterador asincrónico
Puede obtener más información sobre cómo funcionan las sesiones aquí.
Administración de recursos de un espacio de nombres de Service Bus
ServiceBusAdministrationClient
permite administrar un espacio de nombres con operaciones CRUD en las entidades (colas, temas y suscripciones) y en las reglas de una suscripción.
- Admite la autenticación con un cadena de conexión de Service Bus, así como con las credenciales de AAD de
@azure/identity
forma similar a .ServiceBusClient
Nota: Service Bus aún no admite la configuración de reglas cors para espacios de nombres, por lo que ServiceBusAdministrationClient
no funcionará en el explorador sin deshabilitar la seguridad web. Para obtener más información, consulte aquí.
// 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);
await serviceBusAdministrationClient.deleteQueue(queueName);
- Ejemplo de referencia: administrationClient.ts
Solución de problemas
Estos son algunos pasos iniciales para empezar a diagnosticar problemas. Para más información, consulte la Guía de solución de problemas de Service Bus.
Dependencias de AMQP
La biblioteca de Service Bus depende de la biblioteca rhea-promise para administrar conexiones, enviar y recibir mensajes a través del protocolo AMQP .
Registro
Puede establecer la siguiente variable de entorno para obtener los registros de depuración cuando se usa esta biblioteca.
- Obtención de registros de depuración del SDK de Service Bus
export DEBUG=azure*
- Obtención de registros de depuración desde el SDK de Service Bus y la biblioteca de nivel de protocolo.
export DEBUG=azure*,rhea*
- Si no está interesado en ver la transformación del mensaje (que consume mucha consola o espacio en disco), puede establecer la variable de entorno de la
DEBUG
siguiente manera:
export DEBUG=azure*,rhea*,-rhea:raw,-rhea:message,-azure:core-amqp:datatransformer
- Si solo está interesado en errores, puede establecer la variable de entorno de la
DEBUG
siguiente manera:
export DEBUG=azure:service-bus:error,azure:core-amqp:error,rhea-promise:error,rhea:events,rhea:frames,rhea:io,rhea:flow
Registro en un archivo
- Establezca la variable de
DEBUG
entorno como se muestra anteriormente. - Ejecute el script de prueba de la siguiente manera:
- Las instrucciones de registro del script de prueba van a
out.log
las instrucciones de registro y del sdk van adebug.log
.node your-test-script.js > out.log 2>debug.log
- Las instrucciones de registro del script de prueba y el sdk van al mismo archivo
out.log
redirigiendo stderr a stdout (&1) y luego redirige stdout a un archivo:node your-test-script.js >out.log 2>&1
- Las instrucciones de registro del script de prueba y el SDK van al mismo archivo
out.log
.node your-test-script.js &> out.log
Pasos siguientes
Eche un vistazo al directorio de ejemplos para obtener ejemplos detallados sobre cómo usar esta biblioteca para enviar y recibir mensajes hacia o desde colas, temas y suscripciones de Service Bus.
Contribuciones
Si desea contribuir a esta biblioteca, lea la guía de contribución para obtener más información sobre cómo compilar y probar el código.
Azure SDK for JavaScript
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de