C# 指定的消息不存在。错误代码:MessageNotFound产品工作错误上下文
我有一个worker角色,它使用Azure队列中的消息,并在后台进行一些处理。 当我检查我的日志时,在处理消息时似乎没有记录异常,但在我的日志中仍然出现以下异常(仅粘贴长错误日志中的一些相关文本): System.Net.WebException Microsoft.WindowsAzure.Storage.StorageException消息: 远程服务器返回错误:(404)未找到。遥控器 服务器返回错误:(404)未找到。堆栈跟踪:在 System.Net.HttpWebRequest.GetResponse()位于 Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommandC# 指定的消息不存在。错误代码:MessageNotFound产品工作错误上下文,c#,asp.net,asp.net-mvc-3,azure,queue,C#,Asp.net,Asp.net Mvc 3,Azure,Queue,我有一个worker角色,它使用Azure队列中的消息,并在后台进行一些处理。 当我检查我的日志时,在处理消息时似乎没有记录异常,但在我的日志中仍然出现以下异常(仅粘贴长错误日志中的一些相关文本): System.Net.WebException Microsoft.WindowsAzure.Storage.StorageException消息: 远程服务器返回错误:(404)未找到。遥控器 服务器返回错误:(404)未找到。堆栈跟踪:在 System.Net.HttpWebRequest.Ge
1
cmd,IRetryPolicy策略,OperationContext操作上下文)--下一步
调用堆栈:在
Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand
1
cmd、IRetryPolicy策略、OperationContext操作上下文)位于
Microsoft.WindowsAzure.Storage.Queue.CloudQueue.DeleteMessage(字符串
messageId、字符串PopReceive、QueueRequestOptions选项、,
操作上下文操作上下文)位于
InnovativeExams.Azure.CloudStorage.AzureQueue`1.DeleteMessage(T
消息)指定的消息不存在。
错误代码:MessageNotFound产品工作错误上下文
以下是我在worker角色中的代码:
private void ProcessQueueMessage(object queueMessageToProcess)
{
var queueMessage = queueMessageToProcess as EventCompletedQueueMessage;
try
{
if (_eventCompletedProcessor.Process(queueMessage))
_azureQueue.DeleteMessage(queueMessage);
}
catch (Exception ex)
{
_logger.LogError(string.Format("Event Completed message <{0}> was not processed due to an exception", queueMessage.Id), ex, LogSources.WorkerRole_EventCompletedDispatcher);
}
}
private void ProcessQueueMessage(对象queueMessageToProcess)
{
var queueMessage=queuemessagetoprocessas EventCompletedQueueMessage;
尝试
{
if(_eventCompletedProcessor.Process(queueMessage))
_DeleteMessage(queueMessage);
}
捕获(例外情况除外)
{
_logger.LogError(string.Format(“由于异常而未处理事件完成消息”,queueMessage.Id),例如LogSources.WorkerRole\u EventCompletedDispatcher);
}
}
上述异常在上述catch块中捕获并记录
我认为当工作者角色尝试删除队列中的消息,但未找到消息时,会出现一些问题
需要某人的帮助来帮助我解决这个错误,并了解这里出了什么问题
评论中提出的几个问题:
1) 您是否正在运行工作人员角色的多个实例
答:这是一个现有的应用程序,我发现我们正在使用ThreadPool来预实例化线程,这些线程已经准备好接受工作
2) 你是如何“获取”你的工作者角色的信息的?您是否使用某种领导人选举模式来决定哪个实例获得消息
答:是的,有一个框架可以为要处理的QueueMessage确定适当的调度程序
3) 当您收到消息时,这些消息的可见性超时是多少
A:设定为120
4) 处理这些消息需要多长时间,即从获取消息到删除消息之间需要多长时间
答:我对此不确定。让我解释一下,在什么情况下,您会遇到错误 当您将消息出列(即Azure术语中的
GET Messages
)时,Azure队列服务返回名为popReceive
的内容,必须使用该内容删除或更新消息。此popReceive
是一个不透明的值(即,您不应该围绕它构建任何业务逻辑),它在同一消息再次出列之前保持有效。当消息再次退出队列时,您将为popReceive
获得一个新值,您应该使用此新值删除或更新消息
如果尝试使用旧的popReceive
值删除消息,同时消息再次(通过其他进程)退出队列,则会出现错误
我猜这就是应用程序中发生的情况。请检查是否确实如此:
其中一个工作者角色实例将消息出列并开始处理该消息。根据以上所述,当您将消息出列时,您会将消息隐藏120秒。我假设处理消息的实际时间超过120秒,因此消息会重新出现在队列中。现在有另一个进程将此消息从队列中退出(因此您将获得一个新的
popReceive
)。然而,在第二个进程将消息出列后不久,第1个进程就完成了对消息的处理,现在它想使用它所拥有的popreception
删除消息。由于此PopReceive不再有效,因此任何使用此PopReceive对该邮件执行删除操作的尝试都将导致“未找到邮件”错误。让我解释一下在什么情况下会遇到错误
当您将消息出列(即Azure术语中的GET Messages
)时,Azure队列服务返回名为popReceive
的内容,必须使用该内容删除或更新消息。此popReceive
是一个不透明的值(即,您不应该围绕它构建任何业务逻辑),它在同一消息再次出列之前保持有效。当消息再次退出队列时,您将为popReceive
获得一个新值,您应该使用此新值删除或更新消息
如果尝试使用旧的popReceive
值删除消息,同时消息再次(通过其他进程)退出队列,则会出现错误
我猜这就是应用程序中发生的情况。请检查是否确实如此:
其中一个工作者角色实例将消息出列并开始处理该消息。根据以上所述,当您将消息出列时,您会将消息隐藏120秒。我假设处理这些混乱的实际时间