我们正在使用Azure Queue进行打印作业,但是当通过 queue.DeleteMessage(消息)从队列中删除消息时,该方法将抛出异常。
远程服务器返回错误:(404)未找到
上述异常已经处理,但仍在寻找解决方法。
任何人都可以建议如何解决它。
谢谢, 斯内
答案 0 :(得分:1)
根据this article,我们可以找到:
客户端使用“获取消息”操作检索消息后, 期望客户端处理和删除消息。删除 消息,您必须在响应中返回两项数据 获取消息操作的主体:
- 消息ID,一个不透明的GUID值,用于标识队列中的消息。
- 有效的弹出式收据,一个不透明的值,表示该邮件已被检索。
如果找不到具有匹配弹出收据的邮件,则该服务将返回错误代码404(未找到)。并且弹出收据在以下事件之一发生之前仍然有效:
- 邮件已过期。
- 使用收到的最后一个弹出收据删除了邮件 来自
Get Messages
或Update Message
。- 隐身超时已过,消息已经过去 由
Get Messages
请求出列。当隐身超时 过了,消息再次变得可见。如果它被检索 另一个Get Messages
请求,可以使用返回的弹出收据 删除或更新邮件。- 消息已使用新的可见性超时进行更新。当。。。的时候 消息已更新,将返回新的弹出收据。
醇>
答案 1 :(得分:0)
我今天遇到了这个问题,根本原因是两个不同队列之间的所有权问题。我们设置了两个队列,一个队列用于保存等待处理的消息,另一个队列用于出错的消息。问题与消息如何在队列之间移动的逻辑有关。
如果处理失败,我们将执行以下逻辑:
_errorQueue.AddMessage(msg);
_queue.DeleteMessage(msg);
DeleteMessage也将返回(404)Not (未找到),因为味精已移至errorQueue。我发现了两个解决方案:
如果切换逻辑,则味精将被删除,然后再添加到errorQueue中,这将避免所有权交换。
_queue.DeleteMessage(msg);
_errorQueue.AddMessage(msg);
如果在删除和插入之间发生某些事情(虽然机会很小,但是仍然有机会),则解决方案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
}
如果可以提供更多信息来帮助您调试实际问题。