我正在使用@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-bus
SDK的版本1。
我建议使用最近发布的@azure/service-bus
的最新版本7.0.0。
- @azure/服务总线-7.0.0
- 7.0.0的样本
- 从@azure/service bus v1迁移到v7的指南