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

Azure 从队列中删除消息时,远程服务器返回错误:(404)未找到,azure,azure-storage,Azure,Azure Storage,我们正在使用Azure队列进行打印作业,但是当通过队列从队列中删除消息时。DeleteMessage(message),该方法引发以下异常 远程服务器返回错误:(404)未找到 上述异常已处理,但仍在寻找解决方法 谁能建议一下如何修理它 谢谢, Sneh根据,我们可以发现: 客户端使用Get Messages操作检索消息后, 客户端需要处理和删除该消息。删除 对于消息,您必须在响应中返回两项数据 获取消息操作的主体: 消息ID,一个不透明的GUID值,用于标识队列中的消息 有效的pop回执,一

我们正在使用Azure队列进行打印作业,但是当通过队列从队列中删除消息时。DeleteMessage(message),该方法引发以下异常

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

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

谁能建议一下如何修理它

谢谢, Sneh

根据,我们可以发现:

客户端使用Get Messages操作检索消息后, 客户端需要处理和删除该消息。删除 对于消息,您必须在响应中返回两项数据 获取消息操作的主体:

  • 消息ID,一个不透明的GUID值,用于标识队列中的消息
  • 有效的pop回执,一个不透明的值,指示已检索邮件
如果未找到具有匹配pop回执的消息,服务将返回错误代码404(未找到)。Pop收据在发生以下事件之一之前保持有效:

  • 消息已过期
  • 已使用上次收到的pop回执删除邮件 从
    获取消息
    更新消息
  • 不可见超时已过,消息已被删除 由
    Get Messages
    请求退出队列。当隐身超时时 时间过去后,该消息将再次可见。如果它是由 另一个
    Get Messages
    请求,可以使用返回的pop收据 删除或更新邮件
  • 消息已更新为新的可见性超时。当 消息更新后,将返回新的pop收据

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

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

    _errorQueue.AddMessage(msg);
    _queue.DeleteMessage(msg);
    
    DeleteMessage还将返回一个未找到的(404),因为消息已移动到errorQueue。对于这个问题,我找到了两种解决方案:

    1.开关逻辑 如果切换逻辑,则消息将在添加到errorQueue之前被删除,这将避免所有权交换

    _queue.DeleteMessage(msg);
    _errorQueue.AddMessage(msg);
    
    2.插入邮件副本 解决方案#1有可能在删除和插入之间发生某些事情时丢失消息(虽然可能性很小,但仍然有可能)。我使用的解决方案插入了一个具有相同负载的msg副本,因此它没有遇到所有权问题,因为它是一个不同的对象

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

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

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

    If可以提供更多信息来帮助您调试真正的问题

    你能分享代码吗?请包括获取消息和删除消息的代码。请不要在评论中包含代码,而是编辑问题并将代码放在那里。谢谢。@RickvandenBosch-问题是关于存储队列而不是服务总线队列。您包含的链接用于服务总线队列。您正在处理来自多个进程的消息吗@GauravMantri遗漏了一个标签,很抱歉:)有更新吗?您现在找到404错误的原因了吗?