正在使用 Azure 服务总线消息传送,因为我遇到了一些奇怪的问题。
我创建了一个具有"Peeklock"模式的订阅客户端。 使用 SubscriptionClient.ReceiveBatch(500) 方法并收到"n"条消息。然后循环这些消息并执行我的进程,如果我的进程成功完成,则使用 BrokeredMessage.Complete() 从队列中删除该消息。如果该过程中有任何问题,请使用 BrokeredMessage.Abandon() 来更新消息。但消息不会从队列中删除。
经过一些分析,我怀疑我的进程需要更多时间,并且消息锁在进程完成之前就过期了。
然后我决定,在收到来自队列的消息后,我将这些消息推送到本地字符串数组中,然后调用 BrokeredMessage.Complete()。 因此,锁定不可能过期。 但消息仍然不会从队列中删除。
请给出一些解决此问题的想法。
*
BrokeredMessage.Abandon() 来更新消息。但消息是 未从队列中删除。
*
放弃不会放弃信息。 它放弃了锁。
https://learn.microsoft.com/en-us/dotnet/api/microsoft.servicebus.messaging.brokeredmessage.abandon?view=azureservicebus-4.0.0#Microsoft_ServiceBus_Messaging_BrokeredMessage_Abandon
放弃对窥视锁定邮件的锁定。
放弃肯定会允许消息在以后重新可用。
叫。完成以将消息从队列中移除。
而且你必须小心,正如你所建议的那样...关于获取 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/