远程服务器返回错误:(404)未找到从队列中删除消息时

时间:2017-07-14 08:02:34

标签: azure azure-storage

我们正在使用Azure Queue进行打印作业,但是当通过 queue.DeleteMessage(消息)从队列中删除消息时,该方法将抛出异常。

远程服务器返回错误:(404)未找到

上述异常已经处理,但仍在寻找解决方法。

任何人都可以建议如何解决它。

谢谢, 斯内

2 个答案:

答案 0 :(得分:1)

根据this article,我们可以找到:

  

客户端使用“获取消息”操作检索消息后,   期望客户端处理和删除消息。删除   消息,您必须在响应中返回两项数据   获取消息操作的主体:

     
      
  • 消息ID,一个不透明的GUID值,用于标识队列中的消息。
  •   
  • 有效的弹出式收据,一个不透明的值,表示该邮件已被检索。
  •   

如果找不到具有匹配弹出收据的邮件,则该服务将返回错误代码404(未找到)。并且弹出收据在以下事件之一发生之前​​仍然有效:

  
      
  1. 邮件已过期。
  2.   
  3. 使用收到的最后一个弹出收据删除了邮件   来自Get MessagesUpdate Message
  4.   
  5. 隐身超时已过,消息已经过去   由Get Messages请求出列。当隐身超时   过了,消息再次变得可见。如果它被检索   另一个Get Messages请求,可以使用返回的弹出收据   删除或更新邮件。
  6.   
  7. 消息已使用新的可见性超时进行更新。当。。。的时候   消息已更新,将返回新的弹出收据。
  8.   

答案 1 :(得分:0)

我今天遇到了这个问题,根本原因是两个不同队列之间的所有权问题。我们设置了两个队列,一个队列用于保存等待处理的消息,另一个队列用于出错的消息。问题与消息如何在队列之间移动的逻辑有关。

如果处理失败,我们将执行以下逻辑:

_errorQueue.AddMessage(msg);
_queue.DeleteMessage(msg);

DeleteMessage也将返回(404)Not (未找到),因为味精已移至errorQueue。我发现了两个解决方案:

1。开关逻辑

如果切换逻辑,则味精将被删除,然后再添加到errorQueue中,这将避免所有权交换。

_queue.DeleteMessage(msg);
_errorQueue.AddMessage(msg);

2。插入邮件副本

如果在删除和插入之间发生某些事情(虽然机会很小,但是仍然有机会),则解决方案1可能会丢失消息。我所用的解决方案插入了具有相同有效负载的msg副本,因此它没有遇到此所有权问题,因为它是一个不同的对象。

_errorQueue.AddMessage(new CloudQueueMessage(msg.AsString));
_queue.DeleteMessage(msg);

调试提示

我在调试它时遇到的一个有用提示,请确保您捕获的异常不是默认的Exception。而是捕获StorageException以获得对Azure存储相关的错误信息的访问。

try
{
    _queue.DeleteMessage(msg);
}
catch (StorageException ex) //use this instead of base Exception
{
    var info = ex.RequestInformation; //has useful information
}

如果可以提供更多信息来帮助您调试实际问题。