azureservicebus - Azure 服务总线接收器消息处理程序被多次调用相同的消息
问题描述
我正在使用 Azure 服务总线 JS sdk 从 ASB 主题接收消息。接收器正在使用默认模式(即 Peek)模式。我在消息处理程序中调用了 completeMessage()。我所看到的是,消息处理程序被同一条消息多次调用。发件人只发送一次消息。
const myMessageHandler = async (messageReceived) => {
this.receiver.completeMessage(messageReceived);
// process messageReceived
.....
}
this.receiver.subscribe({
processMessage: myMessageHandler,
processError: myErrorHandler
});
你能告诉我可能是什么问题吗?我认为 ASB 正在多次传递消息,尽管接收已经完成了消息。
解决方案
通常,在 Azure 服务总线中,如果接收方未对该消息执行任何操作,则会重新处理该消息。这个动作可以是完成、推迟、死信。
但这不应该是您的问题,因为您正在对completeMessage()
收到的消息使用操作。因此,您面临的问题可能是由于异常。作为一般的最佳实践,最好在消息处理代码中处理所有异常,这样就永远不会达到锁定持续时间,如下面的代码片段所示。
...
try {
//Process message code
}
catch (Exception ex) {
//Abandon message
}
...
...
检查你得到什么异常。我能做的一件事是MessageLockLostException
,它是由于 autoComplete 的默认值。请注意,AutoComplete的默认值为true。然后,如果我们要使用completeMessage()
动作,那么我们应该设置autoComplete
为 false。否则可能会导致MessageLockLostException
.
如果您仍然遇到问题,请检查@Tomas 建议的此配置选项。另请查看使用服务总线消息传递的性能改进最佳实践文档以获取更多信息。
推荐阅读
- r - R中散点图中的45度线和相同的坐标长度
- python - 无效参数:预期图像(JPEG、PNG 或 GIF),格式未知,以 'RIFF\320\025\000\000WEBPVP8 ' 开头
- python - 如何在保持初始数据集的同时对每个时代的训练数据集进行洗牌?
- django - how to access to choices in SimpleArrayFiled with a multiple choice filed using django forms
- ios - 如何接收所有捐赠的意图?
- spring - 无法从另一个模块读取属性
- html - 我的 CSS 文件不工作,我无法让它工作
- google-bigquery - 使用 Big Query UI 在每天两个时间段安排查询
- angular - 如何在响应式表单字段中传递响应值?
- firefox - Firefox:查看是什么修改了我的 HTTP 标头