0

我正在使用 azure service bus 消息传递,因为我遇到了一些奇怪的问题。

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

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

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

请给出一些想法来解决这个问题。

4

1 回答 1

2

*

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

*

Abandon 不会放弃消息。它放弃了锁。

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

放弃对 peek-locked 消息的锁定。

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/

于 2017-04-10T20:27:22.790 回答