目前我要在网络工作上实施我的服务队列总线。我对每封邮件执行的过程大约需要5到30秒。虽然我没有在同一时间收到很多消息,但它运行正常,没有任何例外。否则我收到此错误:提供的锁无效。锁定已过期,或者消息已从队列中删除。
我读过一些关于时间的事情,我应该用它来避免这个错误,但它并没有帮助我(我仍然得到这个错误)而且我没有'知道它为什么会发生吗?也许有人堆积在类似的问题上并用我使用的其他解决方案解决它(我将MaxAutoRenewDuration改为5分钟)。
我的网络工作实施可能有问题吗? 这是我的代码:
static void Main(string[] args)
{
MainAsync().GetAwaiter().GetResult();
}
static async Task MainAsync()
{
JobHostConfiguration config = new JobHostConfiguration();
config.Tracing.ConsoleLevel = System.Diagnostics.TraceLevel.Error;
queueClient = new QueueClient(ServiceBusConnectionString, QueueName);
RegisterOnMessageHandlerAndReceiveMessages();
JobHost host = new JobHost(config);
if (config.IsDevelopment)
{
config.UseDevelopmentSettings();
}
host.RunAndBlock();
}
static void RegisterOnMessageHandlerAndReceiveMessages()
{
var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
{
MaxConcurrentCalls = 1,
MaxAutoRenewDuration = TimeSpan.FromMinutes(5),
AutoComplete = false
};
queueClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
}
static async Task ProcessMessagesAsync(Message message, CancellationToken token)
{
var watch = System.Diagnostics.Stopwatch.StartNew();
Console.WriteLine("----------------------------------------------------");
try
{
Thread.Sleep(15000); // average time of actions that i perform
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
var results = true;
}
catch (Exception ex)
{
}
Console.WriteLine("----------------------------------------------------");
await queueClient.CompleteAsync(message.SystemProperties.LockToken);
}
答案 0 :(得分:0)
MessageHandlerOptions
有ExceptionReceivedHandler
callback您可以用来获取有关失败的更多详细信息。
可能会发生丢失锁定,尤其是如果客户端无法按时与服务器进行通信,或者Azure Service Bus会自行重试,但需要时间。正常LockDuration
时间为60秒,因此您的示例代码应该有效。可能是您遇到了客户端重试的连接问题,然后锁定已过期。另一个选项是本地计算机和服务器之间的时钟偏差,这会加速锁定到期。您可以同步时钟以消除它。
请注意,MaxAutoRenewDuration
不如LockDuration
有效。最好将LockDuration
设置为依赖MaxAutoRenewDuration
的最大值。
如果此代码不是您用来重现问题的代码,请分享详细信息。