Build messaging applications using Azure Service Bus SDK for JavaScript (@azure/service-bus). Use when implementing queues, topics/subscriptions, message sessions, dead-letter handling, or enterprise messaging patterns.
Add this skill
npx mdskills install sickn33/azure-servicebus-tsComprehensive Azure Service Bus reference with strong examples and best practices
1---2name: azure-servicebus-ts3description: Build messaging applications using Azure Service Bus SDK for JavaScript (@azure/service-bus). Use when implementing queues, topics/subscriptions, message sessions, dead-letter handling, or enterprise messaging patterns.4package: "@azure/service-bus"5---67# Azure Service Bus SDK for TypeScript89Enterprise messaging with queues, topics, and subscriptions.1011## Installation1213```bash14npm install @azure/service-bus @azure/identity15```1617## Environment Variables1819```bash20SERVICEBUS_NAMESPACE=<namespace>.servicebus.windows.net21SERVICEBUS_QUEUE_NAME=my-queue22SERVICEBUS_TOPIC_NAME=my-topic23SERVICEBUS_SUBSCRIPTION_NAME=my-subscription24```2526## Authentication2728```typescript29import { ServiceBusClient } from "@azure/service-bus";30import { DefaultAzureCredential } from "@azure/identity";3132const fullyQualifiedNamespace = process.env.SERVICEBUS_NAMESPACE!;33const client = new ServiceBusClient(fullyQualifiedNamespace, new DefaultAzureCredential());34```3536## Core Workflow3738### Send Messages to Queue3940```typescript41const sender = client.createSender("my-queue");4243// Single message44await sender.sendMessages({45 body: { orderId: "12345", amount: 99.99 },46 contentType: "application/json",47});4849// Batch messages50const batch = await sender.createMessageBatch();51batch.tryAddMessage({ body: "Message 1" });52batch.tryAddMessage({ body: "Message 2" });53await sender.sendMessages(batch);5455await sender.close();56```5758### Receive Messages from Queue5960```typescript61const receiver = client.createReceiver("my-queue");6263// Receive batch64const messages = await receiver.receiveMessages(10, { maxWaitTimeInMs: 5000 });65for (const message of messages) {66 console.log(`Received: ${message.body}`);67 await receiver.completeMessage(message);68}6970await receiver.close();71```7273### Subscribe to Messages (Event-Driven)7475```typescript76const receiver = client.createReceiver("my-queue");7778const subscription = receiver.subscribe({79 processMessage: async (message) => {80 console.log(`Processing: ${message.body}`);81 // Message auto-completed on success82 },83 processError: async (args) => {84 console.error(`Error: ${args.error}`);85 },86});8788// Stop after some time89setTimeout(async () => {90 await subscription.close();91 await receiver.close();92}, 60000);93```9495### Topics and Subscriptions9697```typescript98// Send to topic99const topicSender = client.createSender("my-topic");100await topicSender.sendMessages({101 body: { event: "order.created", data: { orderId: "123" } },102 applicationProperties: { eventType: "order.created" },103});104105// Receive from subscription106const subscriptionReceiver = client.createReceiver("my-topic", "my-subscription");107const messages = await subscriptionReceiver.receiveMessages(10);108```109110## Message Sessions111112```typescript113// Send session message114const sender = client.createSender("session-queue");115await sender.sendMessages({116 body: { step: 1, data: "First step" },117 sessionId: "workflow-123",118});119120// Receive session messages121const sessionReceiver = await client.acceptSession("session-queue", "workflow-123");122const messages = await sessionReceiver.receiveMessages(10);123124// Get/set session state125const state = await sessionReceiver.getSessionState();126await sessionReceiver.setSessionState(Buffer.from(JSON.stringify({ progress: 50 })));127128await sessionReceiver.close();129```130131## Dead-Letter Handling132133```typescript134// Move to dead-letter135await receiver.deadLetterMessage(message, {136 deadLetterReason: "Validation failed",137 deadLetterErrorDescription: "Missing required field: orderId",138});139140// Process dead-letter queue141const dlqReceiver = client.createReceiver("my-queue", { subQueueType: "deadLetter" });142const dlqMessages = await dlqReceiver.receiveMessages(10);143for (const msg of dlqMessages) {144 console.log(`DLQ Reason: ${msg.deadLetterReason}`);145 // Reprocess or log146 await dlqReceiver.completeMessage(msg);147}148```149150## Scheduled Messages151152```typescript153const sender = client.createSender("my-queue");154155// Schedule for future delivery156const scheduledTime = new Date(Date.now() + 60000); // 1 minute from now157const sequenceNumber = await sender.scheduleMessages(158 { body: "Delayed message" },159 scheduledTime160);161162// Cancel scheduled message163await sender.cancelScheduledMessages(sequenceNumber);164```165166## Message Deferral167168```typescript169// Defer message for later170await receiver.deferMessage(message);171172// Receive deferred message by sequence number173const deferredMessage = await receiver.receiveDeferredMessages(message.sequenceNumber!);174await receiver.completeMessage(deferredMessage[0]);175```176177## Peek Messages (Non-Destructive)178179```typescript180const receiver = client.createReceiver("my-queue");181182// Peek without removing183const peekedMessages = await receiver.peekMessages(10);184for (const msg of peekedMessages) {185 console.log(`Peeked: ${msg.body}`);186}187```188189## Key Types190191```typescript192import {193 ServiceBusClient,194 ServiceBusSender,195 ServiceBusReceiver,196 ServiceBusSessionReceiver,197 ServiceBusMessage,198 ServiceBusReceivedMessage,199 ProcessMessageCallback,200 ProcessErrorCallback,201} from "@azure/service-bus";202```203204## Receive Modes205206```typescript207// Peek-Lock (default) - message locked until completed/abandoned208const receiver = client.createReceiver("my-queue", { receiveMode: "peekLock" });209await receiver.completeMessage(message); // Remove from queue210await receiver.abandonMessage(message); // Return to queue211await receiver.deferMessage(message); // Defer for later212await receiver.deadLetterMessage(message); // Move to DLQ213214// Receive-and-Delete - message removed immediately215const receiver = client.createReceiver("my-queue", { receiveMode: "receiveAndDelete" });216```217218## Best Practices2192201. **Use Entra ID auth** - Avoid connection strings in production2212. **Reuse clients** - Create `ServiceBusClient` once, share across senders/receivers2223. **Close resources** - Always close senders/receivers when done2234. **Handle errors** - Implement `processError` callback for subscription receivers2245. **Use sessions for ordering** - When message order matters within a group2256. **Configure dead-letter** - Always handle DLQ messages2267. **Batch sends** - Use `createMessageBatch()` for multiple messages227228## Reference Documentation229230For detailed patterns, see:231232- [Queues vs Topics Patterns](references/queues-topics.md) - Queue/topic patterns, sessions, receive modes, message settlement233- [Error Handling and Reliability](references/error-handling.md) - ServiceBusError codes, DLQ handling, lock renewal, graceful shutdown234
Full transparency — inspect the skill content before installing.