中删除,提供了无效的锁。锁已过期,或者消息已从队列中删除从此例外。我不知道从哪里开始,因为前几个小时一切正常。我的代码似乎也很准确。我将发布处理Azure服务总线消息的方法。publicstaticasyncTaskprocessCalculations(BrokeredMessagemessage){try{if(message!=null){if(connection==null||!connection.IsConnected){connection=awaitConnectionMultiplexer.ConnectAsync("connection,SyncTimeout=10000,ConnectTimeout=10000");//connection=ConnectionMultiplexer.Connect("connection,SyncTimeout=10000,ConnectTimeout=10000");}缓存=connection.GetDatabase();字符串sandpKey=message.Properties["sandp"].ToString();stringdateKey=message.Properties["date"].ToString();stringsymbolclassKey=message.Properties["symbolclass"].ToString();字符串stockdataKey=message.Properties["stockdata"].ToString();字符串stockcomparedataKey=message.Properties["stockcomparedata"].ToString();varsandpTask=cache.GetAsync(sandpKey);vardateTask=cache.GetAsync(dateKey);varsymbolinfoTask=cache.GetAsync(symbolclassKey);varstockdataTask=cache.GetAsync
(stockdataKey);varstockcomparedata塔斯k=cache.GetAsync
(stockcomparedataKey);awaitTask.WhenAll(sandpTask,dateTask,symbolinfoTask,stockdataTask,stockcomparedataTask);列表sandp=sandpTask.Result;DateTimedate=dateTask.Result;SymbolInfosymbolinfo=symbolinfoTask.Result;列表stockdata=stockdataTask.Result;列出stockcomparedata=stockcomparedataTask.Result;StockRatingrating=performCalculations(symbolinfo,date,sandp,stockdata,stockcomparedata);如果(评分!=null){saveToTable(评分);如果(message.LockedUntilUtc.Minute<=1){awaitmessage.RenewLockAsync();}awaitmessage.CompleteAsync();//在这里获取异常}else{Console.WriteLine("Message"+message.MessageId+"Completed!");等待消息.CompleteAsync();}}}catch(TimeoutExceptiontime){Console.WriteLine(time.Message);}catch(MessageLockLostException锁){Console.WriteLine(locks.Message);}catch(RedisConnectionExceptionredis){Console.WriteLine("启动redis服务器服务!");}catch(MessagingCommunicationException通信){Console.WriteLine(communication.Message);}catch(Exceptionex){Console.WriteLine(ex.Message);Console.WriteLine(ex.StackTrace);更新:我检查锁到期前的时间,如果需要它我调用锁更新,但它更新锁没有错误,但我仍然得到这个异常timeLeft=message.LockedUntilUtc-DateTime.UtcNow;if(timeLeft.TotalMinutes<=2){//Console.WriteLine("更新锁!"+((TimeSpan)(message.LockedUntilUtc-DateTime.UtcNow)).TotalMinutes);消息.RenewLock();}catch(MessageLockLostException锁){Console.WriteLine("DeliveryCount:"+message.DeliveryCount);Console.WriteLine("入队时间:"+message.EnqueuedTimeUtc);Console.WriteLine("过期时间:"+message.ExpiresAtUtc);Console.WriteLine("锁定时间:"+message.LockedUntilUtc);Console.WriteLine("预定入队时间:"+message.ScheduledEnqueueTimeUtc);Console.WriteLine("当前时间:"+DateTime.UtcNow);Console.WriteLine("剩余时间:"+timeLeft);到目前为止我所知道的是我的代码可以正常工作一段时间并且更新锁被调用并且可以工作但是我仍然得到锁异常并且在那个异常中,我输出timeleft并且随着代码运行它不断增加时间差让我相信锁过期的时间不会以某种方式改变?我花了几个小时试图理解为什么我会收到MessageLockLostException。对我来说,原因是自动完成默认为真。如果您正在调用messsage.Complete()(或CompleteAsync()),您应该实例化一个OnMessageOptions对象,将AutoComplete设置为false,并将其传递给OnMessage调用。varoptions=newOnMessageOptions();options.AutoComplete=false;client.OnMessage(processCalculations,选项);我有一个类似的问题。消息正在成功处理,但当它们完成时,服务总线不再具有有效锁。原来我的TopicClient.PrefetchCount太高了。一旦获得,锁似乎开始于所有预取消息。如果累积的消息处理时间超过锁定超时,则所有其他预取消息都将无法完成。它将返回服务总线。在创建客户端订阅时,尝试使用客户端的OnMessageOptions()自动更新订阅,而不是手动更新锁,如下:以上为C#学习教程:提供的锁无效。锁已过期,或消息已从队列中删除。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——OnMessageOptionsoptions=newOnMessageOptions();options.AutoRenewTimeout=TimeSpan.FromMinutes(1);尝试{客户端=Subscription.CreateClient();client.OnMessageAsync(MessageReceivedComplete,选项);}catch(Exceptionex){thrownewException(ex);涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
