[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-e436fd7d-8319-4830-8264-ec5ebb7c7e34":3,"$fAXKGvHZIBl6SeFnM0QIqOPZXh9zPD3G_w8c3DWIVmC4":43},{"id":4,"title":5,"description":6,"categoryId":7,"moduleId":8,"tags":9,"prompt":10,"icon":11,"source":12,"sourceUrl":13,"authorId":14,"authorName":15,"isPublic":16,"stars":17,"runs":18,"createdAt":19,"updatedAt":19,"module":20,"category":27,"packages":34},"e436fd7d-8319-4830-8264-ec5ebb7c7e34","azure-servicebus-ts","企业消息队列、主题和订阅。","cat_coding_devops","mod_coding","sickn33,coding","---\nname: azure-servicebus-ts\ndescription: \"Enterprise messaging with queues, topics, and subscriptions.\"\nrisk: unknown\nsource: community\ndate_added: \"2026-02-27\"\n---\n\n# Azure Service Bus SDK for TypeScript\n\nEnterprise messaging with queues, topics, and subscriptions.\n\n## Installation\n\n```bash\nnpm install @azure\u002Fservice-bus @azure\u002Fidentity\n```\n\n## Environment Variables\n\n```bash\nSERVICEBUS_NAMESPACE=\u003Cnamespace>.servicebus.windows.net\nSERVICEBUS_QUEUE_NAME=my-queue\nSERVICEBUS_TOPIC_NAME=my-topic\nSERVICEBUS_SUBSCRIPTION_NAME=my-subscription\n```\n\n## Authentication\n\n```typescript\nimport { ServiceBusClient } from \"@azure\u002Fservice-bus\";\nimport { DefaultAzureCredential } from \"@azure\u002Fidentity\";\n\nconst fullyQualifiedNamespace = process.env.SERVICEBUS_NAMESPACE!;\nconst client = new ServiceBusClient(fullyQualifiedNamespace, new DefaultAzureCredential());\n```\n\n## Core Workflow\n\n### Send Messages to Queue\n\n```typescript\nconst sender = client.createSender(\"my-queue\");\n\n\u002F\u002F Single message\nawait sender.sendMessages({\n  body: { orderId: \"12345\", amount: 99.99 },\n  contentType: \"application\u002Fjson\",\n});\n\n\u002F\u002F Batch messages\nconst batch = await sender.createMessageBatch();\nbatch.tryAddMessage({ body: \"Message 1\" });\nbatch.tryAddMessage({ body: \"Message 2\" });\nawait sender.sendMessages(batch);\n\nawait sender.close();\n```\n\n### Receive Messages from Queue\n\n```typescript\nconst receiver = client.createReceiver(\"my-queue\");\n\n\u002F\u002F Receive batch\nconst messages = await receiver.receiveMessages(10, { maxWaitTimeInMs: 5000 });\nfor (const message of messages) {\n  console.log(`Received: ${message.body}`);\n  await receiver.completeMessage(message);\n}\n\nawait receiver.close();\n```\n\n### Subscribe to Messages (Event-Driven)\n\n```typescript\nconst receiver = client.createReceiver(\"my-queue\");\n\nconst subscription = receiver.subscribe({\n  processMessage: async (message) => {\n    console.log(`Processing: ${message.body}`);\n    \u002F\u002F Message auto-completed on success\n  },\n  processError: async (args) => {\n    console.error(`Error: ${args.error}`);\n  },\n});\n\n\u002F\u002F Stop after some time\nsetTimeout(async () => {\n  await subscription.close();\n  await receiver.close();\n}, 60000);\n```\n\n### Topics and Subscriptions\n\n```typescript\n\u002F\u002F Send to topic\nconst topicSender = client.createSender(\"my-topic\");\nawait topicSender.sendMessages({\n  body: { event: \"order.created\", data: { orderId: \"123\" } },\n  applicationProperties: { eventType: \"order.created\" },\n});\n\n\u002F\u002F Receive from subscription\nconst subscriptionReceiver = client.createReceiver(\"my-topic\", \"my-subscription\");\nconst messages = await subscriptionReceiver.receiveMessages(10);\n```\n\n## Message Sessions\n\n```typescript\n\u002F\u002F Send session message\nconst sender = client.createSender(\"session-queue\");\nawait sender.sendMessages({\n  body: { step: 1, data: \"First step\" },\n  sessionId: \"workflow-123\",\n});\n\n\u002F\u002F Receive session messages\nconst sessionReceiver = await client.acceptSession(\"session-queue\", \"workflow-123\");\nconst messages = await sessionReceiver.receiveMessages(10);\n\n\u002F\u002F Get\u002Fset session state\nconst state = await sessionReceiver.getSessionState();\nawait sessionReceiver.setSessionState(Buffer.from(JSON.stringify({ progress: 50 })));\n\nawait sessionReceiver.close();\n```\n\n## Dead-Letter Handling\n\n```typescript\n\u002F\u002F Move to dead-letter\nawait receiver.deadLetterMessage(message, {\n  deadLetterReason: \"Validation failed\",\n  deadLetterErrorDescription: \"Missing required field: orderId\",\n});\n\n\u002F\u002F Process dead-letter queue\nconst dlqReceiver = client.createReceiver(\"my-queue\", { subQueueType: \"deadLetter\" });\nconst dlqMessages = await dlqReceiver.receiveMessages(10);\nfor (const msg of dlqMessages) {\n  console.log(`DLQ Reason: ${msg.deadLetterReason}`);\n  \u002F\u002F Reprocess or log\n  await dlqReceiver.completeMessage(msg);\n}\n```\n\n## Scheduled Messages\n\n```typescript\nconst sender = client.createSender(\"my-queue\");\n\n\u002F\u002F Schedule for future delivery\nconst scheduledTime = new Date(Date.now() + 60000); \u002F\u002F 1 minute from now\nconst sequenceNumber = await sender.scheduleMessages(\n  { body: \"Delayed message\" },\n  scheduledTime\n);\n\n\u002F\u002F Cancel scheduled message\nawait sender.cancelScheduledMessages(sequenceNumber);\n```\n\n## Message Deferral\n\n```typescript\n\u002F\u002F Defer message for later\nawait receiver.deferMessage(message);\n\n\u002F\u002F Receive deferred message by sequence number\nconst deferredMessage = await receiver.receiveDeferredMessages(message.sequenceNumber!);\nawait receiver.completeMessage(deferredMessage[0]);\n```\n\n## Peek Messages (Non-Destructive)\n\n```typescript\nconst receiver = client.createReceiver(\"my-queue\");\n\n\u002F\u002F Peek without removing\nconst peekedMessages = await receiver.peekMessages(10);\nfor (const msg of peekedMessages) {\n  console.log(`Peeked: ${msg.body}`);\n}\n```\n\n## Key Types\n\n```typescript\nimport {\n  ServiceBusClient,\n  ServiceBusSender,\n  ServiceBusReceiver,\n  ServiceBusSessionReceiver,\n  ServiceBusMessage,\n  ServiceBusReceivedMessage,\n  ProcessMessageCallback,\n  ProcessErrorCallback,\n} from \"@azure\u002Fservice-bus\";\n```\n\n## Receive Modes\n\n```typescript\n\u002F\u002F Peek-Lock (default) - message locked until completed\u002Fabandoned\nconst receiver = client.createReceiver(\"my-queue\", { receiveMode: \"peekLock\" });\nawait receiver.completeMessage(message);   \u002F\u002F Remove from queue\nawait receiver.abandonMessage(message);    \u002F\u002F Return to queue\nawait receiver.deferMessage(message);      \u002F\u002F Defer for later\nawait receiver.deadLetterMessage(message); \u002F\u002F Move to DLQ\n\n\u002F\u002F Receive-and-Delete - message removed immediately\nconst receiver = client.createReceiver(\"my-queue\", { receiveMode: \"receiveAndDelete\" });\n```\n\n## Best Practices\n\n1. **Use Entra ID auth** - Avoid connection strings in production\n2. **Reuse clients** - Create `ServiceBusClient` once, share across senders\u002Freceivers\n3. **Close resources** - Always close senders\u002Freceivers when done\n4. **Handle errors** - Implement `processError` callback for subscription receivers\n5. **Use sessions for ordering** - When message order matters within a group\n6. **Configure dead-letter** - Always handle DLQ messages\n7. **Batch sends** - Use `createMessageBatch()` for multiple messages\n\n## Reference Documentation\n\nFor detailed patterns, see:\n\n- Queues vs Topics Patterns - Queue\u002Ftopic patterns, sessions, receive modes, message settlement\n- Error Handling and Reliability - ServiceBusError codes, DLQ handling, lock renewal, graceful shutdown\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.\n","","imported","https:\u002F\u002Fgithub.com\u002Fsickn33\u002Fantigravity-awesome-skills","user_system_seed","SkillOPIC",true,132,1144,"2026-05-16 13:07:43",{"id":8,"name":21,"slug":22,"icon":23,"description":24,"sort":25,"createdAt":26},"编程开发","coding","mdi-code-braces","代码生成、调试、审查，提升开发效率",2,"2026-05-16 12:53:40",{"id":7,"name":28,"slug":29,"icon":30,"description":31,"moduleId":8,"sort":32,"skillCount":33,"createdAt":26},"DevOps","devops","mdi-cog-outline","CI\u002FCD、容器化、部署运维",3,162,[35],{"id":36,"skillId":4,"version":37,"fileName":38,"fileSize":39,"filePath":40,"fileHash":41,"manifest":42,"createdAt":19},"a4e97409-d1cf-4d46-81ba-47b70787969e","1.0.0","azure-servicebus-ts.zip",2472,"uploads\u002Fskills\u002Fe436fd7d-8319-4830-8264-ec5ebb7c7e34\u002Fazure-servicebus-ts.zip","6df56786c7890c9b2475c2b45e946164b0a0b19280960b5e8548f1c4dacb956a","[{\"path\":\"SKILL.md\",\"isDirectory\":false,\"size\":6736}]",{"code":44,"message":45,"data":46},200,"success",{"items":47,"stats":48,"page":51},[],{"averageRating":49,"totalRatings":49,"ratingCounts":50},0,[49,49,49,49,49],{"limit":52,"offset":49,"hasMore":53,"nextOffset":52,"ratedOnly":16},15,false]