2016-09-26 19 views
0

我有一个使用Azure队列消息的工作者角色在后台执行一些处理。 当我检查我的日志似乎在处理消息,但仍然在我的日志中我得到以下异常(粘贴一些相关的材料从长期错误日志只)也不例外记录:指定的消息不存在。 ErrorCode:MessageNotFound Prod-WorkerError上下文

System.Net.WebException Microsoft.WindowsAzure.Storage.StorageException Exception messages: The remote server returned an error: (404) Not Found. The remote server returned an error: (404) Not Found. Stack Traces: at System.Net.HttpWebRequest.GetResponse() at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand 1 cmd, IRetryPolicy policy, OperationContext operationContext) --- Next Call Stack: at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand 1 cmd, IRetryPolicy policy, OperationContext operationContext) at Microsoft.WindowsAzure.Storage.Queue.CloudQueue.DeleteMessage(String messageId, String popReceipt, QueueRequestOptions options, OperationContext operationContext) at InnovativeExams.Azure.CloudStorage.AzureQueue`1.DeleteMessage(T message) The specified message does not exist. ErrorCode:MessageNotFound Prod-WorkerError Context

这里是我在工作角色中的代码:

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); 
      } 
     } 

上面的异常被捕获到上面的catch块中并被记录下来。

我认为当工作角色尝试删除队列中的消息并且未找到消息时会出现问题。

需要某人的帮助来帮助我解决这个错误并知道背景有什么问题。

几个问题在评论问:

1)你运行你的Worker角色的多个实例?

答:这是一个现有的应用程序,我想通过使用ThreadPool来预先实例化,准备好工作的线程。

2)你如何“获得”你的工作角色的消息?您是否使用某种领导选举模式来决定哪个实例获取消息?

答:是的,有一个框架可以确定QueueMessage被处理的适当调度器。

3)当您收到消息时,这些消息的可见性超时是多少?

答:它设定为120,

4)多长时间需要为你处理这些消息即多少时间得到消息,并删除邮件之间?

答:我对此不太确定。

+0

很少有问题(请更新您的问题并附上答案):1)您是否正在运行多个工作角色的实例? 2)你如何“获取”你的工作角色中的消息?您是否使用某种领导选举模式来决定哪个实例获取消息? 3)当你收到消息时,这些消息的可见性超时是多少? 4)处理这些消息需要多长时间,即获取消息和删除消息之间需要多长时间? –

+0

@GauravMantri编辑了这个问题。请检查。 – Maninder

回答

2

让我来解释一下你会遇到什么样的错误。

当您将邮件出列(Azure术语中的GET Messages)时,Azure队列服务会返回一个名为popreceipt的东西,该东西必须用于删除或更新邮件。这个popreceipt是一个不透明的值(也就是说,你不应该在它周围建立任何业务逻辑),它保持有效,直到同一消息再次出队。当邮件再次出列时,您将获得popreceipt的新值,您应该使用此新值来删除或更新邮件。

如果您尝试使用旧的popreceipt值在邮件再次出列时删除邮件(通过其他进程),您将收到您收到的错误。

我的猜测是,这是你的应用程序中发生的事情。请检查是否确实如此:

其中一个工作程序角色实例将邮件出队并开始处理该邮件。根据上面的说明,当您将邮件出列时,您将邮件隐藏120秒。我假设处理消息所需的实际时间超过120秒,因此消息再次出现在队列中。现在有另一个流程将这条消息出列(因此你得到一个新的popreceipt)。然而,在第二个进程将消息出队后不久,第一个进程完成了对该消息的处理,现在它想要使用它所具有的popreceipt来删除该消息。由于此popreceipt不再有效,因此使用此popreceipt对该消息执行删除操作的任何尝试都将导致未找到消息错误。

+0

感谢Gaurav解释PopReceipt的深入细节。我也正在假设同样的情况,但并没有深入了解这一点。 我会尝试添加一个秒表,然后会看到多少时间来处理消息,并相应地更新队列可见性。 – Maninder

相关问题