首页 > 解决方案 > 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 正在多次传递消息,尽管接收已经完成了消息。

标签: azureservicebusazure-servicebus-topics

解决方案


通常,在 Azure 服务总线中,如果接收方未对该消息执行任何操作,则会重新处理该消息。这个动作可以是完成、推迟、死信。

但这不应该是您的问题,因为您正在对completeMessage()收到的消息使用操作。因此,您面临的问题可能是由于异常。作为一般的最佳实践,最好在消息处理代码中处理所有异常,这样就永远不会达到锁定持续时间,如下面的代码片段所示。

    ...
    try { 
            //Process message code 
    } 
    catch (Exception ex) {
            //Abandon message
    }
    ...
    ...

检查你得到什么异常。我能做的一件事是MessageLockLostException,它是由于 autoComplete 的默认值。请注意,AutoComplete的默认值为true。然后,如果我们要使用completeMessage()动作,那么我们应该设置autoComplete为 false。否则可能会导致MessageLockLostException.

如果您仍然遇到问题,请检查@Tomas 建议的此配置选项。另请查看使用服务总线消息传递的性能改进最佳实践文档以获取更多信息。


推荐阅读