多次使用同一消息调用 Azure 服务总线接收器消息处理程序
Azure service bus receiver message handler get invoked with same message multiple times
我正在使用 Azure Service Bus 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 的默认值为真。那么如果我们要使用 completeMessage()
动作,那么我们应该将 autoComplete
设置为 false。否则它会导致 MessageLockLostException
.
如果问题仍然存在,请查看此 suggested by @Tomas. Also check the Best Practices for performance improvements using Service Bus Messaging 文档以获取更多信息。
我正在使用 Azure Service Bus 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 的默认值为真。那么如果我们要使用 completeMessage()
动作,那么我们应该将 autoComplete
设置为 false。否则它会导致 MessageLockLostException
.
如果问题仍然存在,请查看此