消息不会从azure服务总线订阅中删除

时间:2017-04-06 14:04:27

标签: message-queue servicebus azure-servicebus-queues azure-servicebus-topics brokeredmessage

我正在使用azure服务总线消息,因为我遇到了一些奇怪的问题。

我用“peeklock”模式创建了一个订阅客户端。 使用SubscriptionClient.ReceiveBatch(500)方法并收到'n'个消息。然后循环这些消息并执行我的过程,如果我的进程成功完成,则使用BrokeredMessage.Complete()从队列中删除该消息。如果在该过程中有任何问题,我使用BrokeredMessage.Abandon()来更新消息。但是消息不会从队列中删除。

经过一些分析后,我怀疑我的进程花了更多的时间,并且在进程完成之前消息锁已经过期。

然后我决定,在收到队列消息后,我将这些消息推送到本地字符串数组,然后调用BrokeredMessage.Complete()。 所以没有锁定到期的可能性。 但是仍然没有从队列中删除消息。

请妥善解决此问题。

1 个答案:

答案 0 :(得分:0)

*

  

BrokeredMessage.Abandon()更新消息。但消息是   没有从队列中删除。

*

放弃并没有放弃这条消息。放弃了LOCK。

https://docs.microsoft.com/en-us/dotnet/api/microsoft.servicebus.messaging.brokeredmessage.abandon?view=azureservicebus-4.0.0#Microsoft_ServiceBus_Messaging_BrokeredMessage_Abandon

放弃对隐藏锁定消息的锁定。

Abandon肯定会允许该消息在以后重新可用。

调用.Complete将消息从队列中删除。

你必须小心,因为你建议......关于获得N(在你的情况下为500)消息......并且在锁机制生效之前无法完成(全部)它们。

以下是一些想法。

http://markheath.net/post/defer-processing-azure-service-bus-message

这可能是我见过的最好的主意,但是,这只是一条消息。

http://dotnetartisan.in/2016/01/24/avoiding-messagelocklostexception-using-auto-renew-pattern-for-brokeredmessage-service-bus-queue/