通过使用Azure服务总线主题和订阅-我能够在两个系统之间传递消息。但是有时候,我得到这个锁过期异常。如何避免呢?
异常-消息处理程序遇到异常Microsoft.Azure.ServiceBus.MessageLockLostException:提供的锁无效。锁已过期,或者消息已从队列中删除。
下面是代码:
static async Task MainAsync()
{
TokenProvider tokenProvider = TokenProvider.CreateManagedIdentityTokenProvider();
subscriptionClient = new SubscriptionClient(serviceBusNamespace, topicName, subscriptionName,
tokenProvider, receiveMode: ReceiveMode.PeekLock);
// Register subscription message handler and receive messages in a loop
RegisterOnMessageHandlerAndReceiveMessages();
Console.Read();
await subscriptionClient.CloseAsync();
}
static void RegisterOnMessageHandlerAndReceiveMessages()
{
var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
{
MaxConcurrentCalls = 1,
AutoComplete = false
};
// Register the function that processes messages.
subscriptionClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
}
static async Task ProcessMessagesAsync(Message message, CancellationToken token)
{
// Process the message recieved.
Console.WriteLine($"Received message: SequenceNumber:{message.SystemProperties.SequenceNumber} Body:{Encoding.UTF8.GetString(message.Body)}");
await subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
}
答案 0 :(得分:-1)
锁丢失异常通常是客户端错误,可能有两个原因,要么是服务总线端出现了一些问题(高利用率,邻居吵闹等等),要么客户端太忙而无法及时完成请求或某些非常慢的网络。
从门户检查服务总线指标,并在观察到该问题的那段时间内查看是否存在任何内部错误或服务器繁忙错误。如果没有,那么建议将调查您的客户端应用程序指标,并查看在此期间是否有任何高利用率(CPU,内存,网络等),这可能会导致该时间段出现问题。
如果上述方法仍然无济于事,并且仍然更频繁地观察到锁丢失错误,那么我建议您在应用程序代码中添加日志记录,以确认完成消息所需的时间。如果您要执行任何业务逻辑,请记录时间执行该代码段所需的时间。日志应为您提供详细信息,您的应用程序正在使用的messageID,UTC的时间范围,在该消息上获取的锁定令牌以及每个语句的执行时间(业务逻辑) 您还可以在CompleteAsync调用之前和之后添加一个计时器,以检查将邮件标记为完成所花费的时间。如果您在代码中添加了预取,我也建议您删除预取。
如果在锁定时间内发生问题,请验证上述详细信息,这将需要客户端和服务总线端进行深入的故障排除。获得了上述信息并在应用程序中添加了更多日志后,您可以创建支持凭单以寻求进一步的帮助,或者将包含主题行“ Attn:Mayank”的电子邮件发送到AzCommunity [at] Microsoft [dot] com,以引用此线程连同您的Azure订阅ID,服务总线名称,队列名称,接收方应用程序详细信息以及异常消息,消息ID,锁定令牌,已发现问题的单个消息的时间范围。