我正在.net核心应用程序之一中使用Azure Service Bus队列,以FIFO顺序从队列接收消息。一旦从队列接收到消息,那么我将处理每条消息的业务逻辑。处理完每条消息的业务逻辑后,我尝试使用以下代码行从Queue中删除消息:
await _messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
但是对于一些消息,我无法从Queue中删除消息。因为即使我在服务总线队列上配置了“锁定持续时间” 3分钟,对消息的锁定也已过期。
从服务总线队列中删除/完成消息时出现以下错误:
异常类型:System.InvalidOperationException
异常消息:由于对象的当前状态,操作无效。
这些是我在Azure Service Bus队列上配置的属性:
Max Delivery Count =1
Lock Duration=3 minutes
由于某些原因,您无法删除Azure Service Bus队列中的消息。
具有锁定持续时间的挑战
第一个挑战是时间,特别是每条消息一旦检索就锁定时间。问题是消息必须显示在UI中,然后为客户提供时间选择要重新提交或删除的消息。解决方案是要求客户增加锁定时间,但是由于多种原因,这是不可能的。首先,由于客户的整合,可能无法增加锁定时间,因此我们不能依靠它。
Read more on this blog post关于如何克服挑战。