c# - 在 Azure 服务总线上调用 Abandon 会将消息重新排队到队列的后面而不是前面

标签 c# session azure azureservicebus

我正在使用启用了基于 session 的消息传递的 Azure 服务总线队列。为了从队列中使用,我注册了一个 IMessageSessionAsyncHandler,然后在 OnMessageAsync 方法中处理消息。

我看到的这个问题是,如果我出于某种原因放弃一条消息,而不是立即再次收到消息,我会收到 session 中的下一条消息,并且只有在处理该消息后,我才会再次收到第一条消息(假设 session 中只有两条消息)。

举个例子,假设我有一个队列,上面有 2 条消息,两条消息都具有相同的 SessionId。两条消息的序列号分别为1和2。正如预期的那样,我开始接收并获取序列 1 的消息。如果我随后使用 message.Abandon 放弃此消息(放弃的原因无关紧要),我会立即收到 session 中的下一条消息(序列号 2)。只有在处理(或放弃)第二条消息后,我才会再次收到第一条消息。

我看到的这种行为并不是我所期望的放弃消息的行为,并且与使用队列的其他方式不一致。我在以下场景中测试了相同的示例

  • 不使用 IMessageSessionAsyncHandler,而只是手动接受消息 session 。
  • 不使用 session ,而只是在队列中放置两条独立的消息。

在这两种情况下,我都看到了预期的行为,因为当我放弃一条消息时,它总是保证是收到的下一条消息,除非超过最大传递计数并且它是死信的。

我的问题是这样的:我在使用 IMessageSessionAsyncHandler 时看到的行为是预期的,还是服务总线库中的错误?如果这不是一个错误,谁能给我解释一下为什么它的行为与其他接收方式不同?

最佳答案

当您在 Queueclient 上注册 session 处理程序时,预取会在内部打开,以改善接收器的延迟和吞吐量。不幸的是,对于 IMessageSessionAsyncHandler 场景,无法覆盖此行为。一种选择是当 session 中遇到需要放弃的消息时放弃 session 本身,这将确保消息按顺序传递。

关于c# - 在 Azure 服务总线上调用 Abandon 会将消息重新排队到队列的后面而不是前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24233434/

相关文章:

java - 浏览器如何维护 session cookie

java - Spring 安全 : Show warning before overwriting session

node.js - 用于容器的 Azure Web 应用程序 - 启动期间失败 - 未响应 HTTP ping

Azure 资源管理器 : How to specify optional parameters in linked templates

Windows azure,如何清除文件夹DevFCLogs?

c# - 聚合不同责任的最佳方式

c# - 使用 Docker .NET Core 镜像构建 WinForms C# 应用程序会导致错误 : . NETFramework,Version=v4.6.1 未找到

c# - 为什么图像的流媒体源不起作用?

c# - 具有 Silverlight 4 WCF RIA 域服务的复杂类型

node.js - 浏览器上基于 token 的身份验证和 session /本地存储