【问题标题】:Azure ServiceBus ReceiveDeferredMessageAsync() FailsAzure ServiceBus ReceiveDeferredMessageAsync() 失败
【发布时间】:2020-10-02 13:58:17
【问题描述】:

我正在尝试在 Azure ServiceBus 中实现“消息延迟”模式,但无法让基本示例正常工作。我正在使用Microsoft.Azure.ServiceBus v5.0.0 并遵循this SO questionthis Microsoft Documentation 的建议。

// Send a message
var sender = new MessageSender("my_sb_connection_string", "my_queue_name", RetryPolicy.Default);
await sender.SendAsync(new Message());

// Receive the message, defer it and then receive the deferred message
var receiver = new MessageReceiver("my_sb_connection_string", "my_queue_name", 
                                   ReceiveMode.PeekLock, RetryPolicy.Default);

var msg = await receiver.ReceiveAsync();

await receiver.DeferAsync(msg.SystemProperties.LockToken);

var deferredMsg = await receiver.ReceiveDeferredMessageAsync(msg.SystemProperties.SequenceNumber);

每次我打电话给ReceiveDeferredMessageAsync(),我都会得到一个异常:

Microsoft.Azure.ServiceBus.MessageNotFoundException: Messages not found. One or more sequence numbers missing. 

我确定我做错了一些简单的事情,但我看不出它可能是什么。

【问题讨论】:

  • 具有该特定序列号的消息是否在队列中?
  • @SeanFeldman 该消息在DeferAsync() 调用之后立即在死信队列中。这根本不是我所期望的。
  • @SeanFeldman 所以我为死信队列创建了第二个接收器,并尝试在那里接收延迟消息。不走运,我得到Microsoft.Azure.ServiceBus.MessageNotFoundException: Failed to lock one or more specified messages as they were not deferred messages. 所以消息不在主队列中,您无法从DLQ 接收它。至少,不是作为延迟消息。

标签: azure .net-core azure-servicebus-queues


【解决方案1】:

问题原来是我将队列的“最大传递计数”设置为 1 - 消息进入 DLQ(显然)是因为它达到了最大传递计数。

将 Max Delivery Count 更改为大于 1 的值允许 `DeferAsync() 调用正确地将消息标记为延迟。

这对我来说似乎是一个错误。 https://github.com/Azure/azure-service-bus/issues/375

【讨论】:

  • 这是有道理的。推迟消息意味着它将被第二次传递。如果您已将队列设置为仅允许 1 次传递,则无法重新传递消息,因此无法延迟。
猜你喜欢
  • 1970-01-01
  • 2023-02-17
  • 1970-01-01
  • 2021-08-20
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多