使用nodejs在单个请求上设置多个Azure服务总线消息



我正在使用@Azure/Service Bus 从Azure服务总线接收消息

使用类似这样的(简化的(

let receivingMode = ReceiveMode.peekLock;
let sbClient = ServiceBusClient.createFromConnectionString(connectionString);  
let subscriptionClient = this.sbClient.createSubscriptionClient(topicName, subscriptionName);
let receiver = this.subscriptionClient.createReceiver(receivingMode);
let messages = await this.receiver.receiveMessages(maxMessageCount, maxWaitTimeInSeconds);

每个批量可能会收到数百条消息,我发现我只能一个接一个地完成((,例如:

for (let index = 0; index < messages.length; index++) {
let message = messages[index];
await message.complete();
}

这似乎将是一个非常缓慢的过程。。。有更好的方法吗?

同时处理您的消息。据我所知,除非你处理过旧邮件,否则你不应该收到新邮件。

const promises = [];
for (let index = 0; index < messages.length; index++) {
let message = messages[index];
promises.push(settleMessage(message));
}
await Promise.all(promises);
async function settleMessage(message) {
// process your message here
// Use other methods (abandon(), deadLetter(), defer()) depending on processing result;
// Otherwise, I suggest to use different receiving mode;
await message.complete();
}

Azure服务总线不支持消息的批量结算(截至目前(。

你可以一个接一个地解决消息,你可以按照其他答案中提到的方法,对所有未完成的承诺进行await,以完成消息。

相关问题https://github.com/Azure/azure-sdk-for-js/issues/11914其中谈到了类似的功能请求和来自服务团队的回复。

此外,问题中的代码片段似乎使用了@azure/service-busSDK的版本1。

我建议使用最近发布的@azure/service-bus的最新版本7.0.0。

  • @azure/服务总线-7.0.0
  • 7.0.0的样本
  • 从@azure/service bus v1迁移到v7的指南

最新更新