azure-servicebus-ts – DevOps & Infrastructure skill for AI agents
Enterprise messaging with queues, topics, and subscriptions.
Install the azure-servicebus-ts skill with one command
Pick the tool you use, copy the command and paste it in your terminal. The skill lands in that tool's skills folder and is ready in your next session.
Claude Code
mkdir -p ~/.claude/skills && curl -fsSL https://skill.dn1nguoi.com/z/azure-servicebus-ts-bce38.tgz | tar xz -C ~/.claude/skills
Call it in Claude Code: /azure-servicebus-ts – then describe the task you want done.
Codex
mkdir -p ~/.codex/skills && curl -fsSL https://skill.dn1nguoi.com/z/azure-servicebus-ts-bce38.tgz | tar xz -C ~/.codex/skills
Call it in Codex: $azure-servicebus-ts – then describe the task you want done.
Hermes Agent
mkdir -p ~/.hermes/skills && curl -fsSL https://skill.dn1nguoi.com/z/azure-servicebus-ts-bce38.tgz | tar xz -C ~/.hermes/skills
Call it in Hermes Agent: /azure-servicebus-ts – then describe the task you want done.
DeepSeek
mkdir -p ~/.deepcode/skills && curl -fsSL https://skill.dn1nguoi.com/z/azure-servicebus-ts-bce38.tgz | tar xz -C ~/.deepcode/skills
Call it in DeepSeek: /azure-servicebus-ts – then describe the task you want done.
SKILL.md content
Azure Service Bus SDK for TypeScript
Enterprise messaging with queues, topics, and subscriptions.
Installation
npm install @azure/service-bus @azure/identityEnvironment Variables
SERVICEBUS_NAMESPACE=<namespace>.servicebus.windows.net
SERVICEBUS_QUEUE_NAME=my-queue
SERVICEBUS_TOPIC_NAME=my-topic
SERVICEBUS_SUBSCRIPTION_NAME=my-subscriptionAuthentication
import { ServiceBusClient } from "@azure/service-bus";
import { DefaultAzureCredential } from "@azure/identity";
const fullyQualifiedNamespace = process.env.SERVICEBUS_NAMESPACE!;
const client = new ServiceBusClient(fullyQualifiedNamespace, new DefaultAzureCredential());Delivery boundaries
Examples mutate queues and independent fragments reuse names. Sending, scheduling and settling messages require authorization for the exact namespace/entity. Make business processing idempotent before completion; peek-lock can redeliver after failure. Avoid logging private bodies, renew locks where needed and close the shared client on shutdown.
Core Workflow
Send Messages to Queue
const sender = client.createSender("my-queue");
// Single message
await sender.sendMessages({
body: { orderId: "12345", amount: 99.99 },
contentType: "application/json",
});
// Batch messages
const batch = await sender.createMessageBatch();
if (!batch.tryAddMessage({ body: "Message 1" }) ||
!batch.tryAddMessage({ body: "Message 2" })) {
throw new Error("Message batch exceeds size limit; split and retry deliberately");
}
await sender.sendMessages(batch);
await sender.close();Receive Messages from Queue
const receiver = client.createReceiver("my-queue");
// Receive batch
const messages = await receiver.receiveMessages(10, { maxWaitTimeInMs: 5000 });
for (const message of messages) {
console.log(`Received: ${message.body}`);
await receiver.completeMessage(message);
}
await receiver.close();Subscribe to Messages (Event-Driven)
const receiver = client.createReceiver("my-queue");
const subscription = receiver.subscribe({
processMessage: async (message) => {
console.log(`Processing: ${message.body}`);
// Message auto-completed on success
},
processError: async (args) => {
console.error(`Error: ${args.error}`);
},
});
// Stop after some time
setTimeout(async () => {
await subscription.close();
await receiver.close();
}, 60000);Topics and Subscriptions
// Send to topic
const topicSender = client.createSender("my-topic");
await topicSender.sendMessages({
body: { event: "order.created", data: { orderId: "123" } },
applicationProperties: { eventType: "order.created" },
});
// Receive from subscription
const subscriptionReceiver = client.createReceiver("my-topic", "my-subscription");
const messages = await subscriptionReceiver.receiveMessages(10);Message Sessions
// Send session message
const sender = client.createSender("session-queue");
await sender.sendMessages({
body: { step: 1, data: "First step" },
sessionId: "workflow-123",
});
// Receive session messages
const sessionReceiver = await client.acceptSession("session-queue", "workflow-123");
const messages = await sessionReceiver.receiveMessages(10);
// Get/set session state
const state = await sessionReceiver.getSessionState();
await sessionReceiver.setSessionState(Buffer.from(JSON.stringify({ progress: 50 })));
await sessionReceiver.close();Dead-Letter Handling
// Move to dead-letter
await receiver.deadLetterMessage(message, {
deadLetterReason: "Validation failed",
deadLetterErrorDescription: "Missing required field: orderId",
});
// Process dead-letter queue
const dlqReceiver = client.createReceiver("my-queue", { subQueueType: "deadLetter" });
const dlqMessages = await dlqReceiver.receiveMessages(10);
for (const msg of dlqMessages) {
console.log(`DLQ Reason: ${msg.deadLetterReason}`);
// Inspect and durably record the authorized recovery outcome first.
// Complete only after successful recovery; logging alone must not delete DLQ evidence.
// await dlqReceiver.completeMessage(msg);
}Scheduled Messages
const sender = client.createSender("my-queue");
// Schedule for future delivery
const scheduledTime = new Date(Date.now() + 60000); // 1 minute from now
const sequenceNumber = await sender.scheduleMessages(
{ body: "Delayed message" },
scheduledTime
);
// Cancel scheduled message
await sender.cancelScheduledMessages(sequenceNumber);Message Deferral
// Defer message for later
await receiver.deferMessage(message);
// Receive deferred message by sequence number
const deferredMessage = await receiver.receiveDeferredMessages(message.sequenceNumber!);
await receiver.completeMessage(deferredMessage[0]);Peek Messages (Non-Destructive)
const receiver = client.createReceiver("my-queue");
// Peek without removing
const peekedMessages = await receiver.peekMessages(10);
for (const msg of peekedMessages) {
console.log(`Peeked: ${msg.body}`);
}Key Types
import {
ServiceBusClient,
ServiceBusSender,
ServiceBusReceiver,
ServiceBusSessionReceiver,
ServiceBusMessage,
ServiceBusReceivedMessage,
ProcessMessageCallback,
ProcessErrorCallback,
} from "@azure/service-bus";Receive Modes
// Peek-Lock (default) - message locked until completed/abandoned
const receiver = client.createReceiver("my-queue", { receiveMode: "peekLock" });
await receiver.completeMessage(message); // Remove from queue
await receiver.abandonMessage(message); // Return to queue
await receiver.deferMessage(message); // Defer for later
await receiver.deadLetterMessage(message); // Move to DLQ
// Receive-and-Delete - message removed immediately
const receiver = client.createReceiver("my-queue", { receiveMode: "receiveAndDelete" });Best Practices
1. Use Entra ID auth - Avoid connection strings in production
2. Reuse clients - Create ServiceBusClient once, share across senders/receivers
3. Close resources - Always close senders/receivers when done
4. Handle errors - Implement processError callback for subscription receivers
5. Use sessions for ordering - When message order matters within a group
6. Configure dead-letter - Always handle DLQ messages
7. Batch sends - Use createMessageBatch() for multiple messages
Reference Documentation
For detailed patterns, see:
- Queues vs Topics Patterns - Queue/topic patterns, sessions, receive modes, message settlement
- Error Handling and Reliability - ServiceBusError codes, DLQ handling, lock renewal, graceful shutdown
When to Use
This skill is applicable to execute the workflow or actions described in the overview.
Limitations
- Use this skill only when the task clearly matches the scope described above.
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.
Related skills
- azure-speech-to-text-rest-py – Azure Speech to Text REST API for short audio (Python). Use for simple speech…
- azure-sql – Provision Azure SQL Database and Cosmos DB. Configure security, backups, and…
- docker-development – Docker and container development agent skill and plugin for Dockerfile optimization…
- azure-storage-blob-py – Azure Blob Storage SDK for Python. Use for uploading, downloading, listing blobs…
- azure-storage-blob-ts – Azure Blob Storage JavaScript/TypeScript SDK (@azure/storage-blob) for blob operations…
- azure-storage-file-datalake-py – Azure Data Lake Storage Gen2 SDK for Python. Use for hierarchical file systems, big data…
- azure-storage-file-share-py – Azure Storage File Share SDK for Python. Use for SMB file shares, directories, and file…
- azure-storage-file-share-ts – Azure File Share JavaScript/TypeScript SDK (@azure/storage-file-share) for SMB file…