【问题标题】:What happens when you try to cancel a scheduled Azure service bus message that has already been enqueued?当您尝试取消已排入队列的计划 Azure 服务总线消息时会发生什么?
【发布时间】:2017-07-28 22:42:59
【问题描述】:

我正在尝试提出为 Azure 服务总线队列或主题安排消息的最佳方式,同时让选项保持打开状态以立即发送消息而不是预定消息。如果我尝试在第一条消息的预定时间或之后发送替换消息,我想确保自己可以防止创建重复消息。

如果我在消息已入队后尝试使用 CancelScheduledMessageAsync(对于 QueueClient 和 TopicClient 类)取消计划消息,会发生什么情况?会抛出异常吗?

【问题讨论】:

  • 你尝试的时候发生了什么?
  • 我将在下周进行试验。只是想知道是否有人已经知道,因为我无法找到有关它的文档。

标签: c# azure-servicebus-queues azure-servicebus-topics


【解决方案1】:

根据您的描述,我发现一个博客(Canceling Scheduled Messages)在谈论类似的问题。

在版本 3.3.1 之前,计划的消息需要在可见之前取消,这是不可能的。任何访问其值的尝试都会导致InvalidOperationException。因此,任何安排在未来且不再需要的消息都将“卡”在代理上,直到稍后时间。

使用Microsoft Azure Service Bus >= 3.3.1 QueueClientTopicClient 可用于安排消息并稍后取消。

另外,我已经通过以下代码对其进行了测试:

BrokeredMessage brokerMsg= new BrokeredMessage("Hello World!!!");
long sequenceNumber = await queueClient.ScheduleMessageAsync(brokerMsg, DateTimeOffset.UtcNow.AddSeconds(30));

await Task.Delay(TimeSpan.FromMinutes(1));
// Cancel scheduled message
await queueClient.CancelScheduledMessageAsync(sequenceNumber);

我登录到 azure 门户并检查了 ACTIVE MESSAGE COUNTSCHEDULED MESSAGE COUNT。我可以在预定消息激活之前取消预定消息,但如果我在预定消息激活后通过sequenceNumber 取消预定消息,那么我将按如下方式检索异常:

【讨论】:

  • 感谢您查看布鲁斯!因此,如果我理解正确,当您在队列上激活消息之后尝试取消消息并且在任何队列工作人员拾取消息之前尝试取消消息时,您会看到抛出异常?
  • 是的,我在队列消息被消费之前调用了取消操作。如果预定的消息已经被激活,那么无论这条消息是否被消费,你都不能取消这条消息。
猜你喜欢
  • 1970-01-01
  • 2012-08-28
  • 2017-04-22
  • 2014-11-03
  • 2017-11-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
相关资源
最近更新 更多