【问题标题】:Is there a way to identify if a message is locked in Service Bus?有没有办法确定消息是否在服务总线中被锁定?
【发布时间】:2021-04-03 12:21:12
【问题描述】:

来自 Azure 服务总线的消息浏览功能的 docs,它表示当我们尝试访问消息的锁定属性时,我们会得到 InvalidOperationException。因此我们无法访问锁定持续时间和令牌详细信息。当我们执行peek 时,是否至少有一种方法或解决方法可以让我们知道它是否已被锁定?

var client = MessagingFactory.CreateQueueClient("queueName");
BrokeredMessage message = client.Peek(); // Retrieves a locked message and its lock properties returns exception or old lock details depending upon its state

【问题讨论】:

  • 问题是你为什么需要知道?偷看不接收。你想完成什么?
  • 我正在尝试编写一个逻辑以使用序列号顺序从队列的开头删除。如果它是延迟消息,peek 可以帮助我获取要立即删除的序列号(通过在其过期/锁定时捕获异常)。如果它是一条活动消息,我可以接收和删除。例如:如果我应该只删除前 10 条消息,并且当我查看队列中的第一条消息时(考虑这是锁定消息并且前 10 条消息中没有更多活动消息),我假设有一个活动消息消息并在第 10 条消息以下的某处收到一条消息。

标签: c# azureservicebus azure-servicebus-queues


【解决方案1】:

不是真的没有。您可以隐式找出,但这只是因为您将无法在任何其他模式下接收它。请记住,所有消息传递都是异步的。

当信息到达接收者时,消息可能已完成或解锁。

Peek 将按原样返回消息,就像您是消费者一样,没有任何元数据。您无法识别锁,因为您无法识别消息的任何其他状态(如死信)

别忘了:

消息浏览或窥视使服务总线客户端能够枚举队列或订阅中的所有消息,以进行诊断和调试。

您可以判断它是活动的、延迟的还是计划的,仅此而已。

重要提示 - 如果您在 peeklock 模式下无法接收它,请不要认为它已被锁定,反之亦然。在两个 api 调用之间可能发生任何事情。

【讨论】:

  • 是的,谢谢@Athanasios,也许如果它是未来实现的一个功能,这将是一个额外的优势。正如您所提到的,一切都是异步的,但是在快照的那个确切点,消息正在发生的事情就是我所看到的。谢谢。
猜你喜欢
  • 2010-11-20
  • 2021-02-05
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多