【问题标题】:Can't delete azure storage queue message after it has been updated (Message not found)更新后无法删除 Azure 存储队列消息(找不到消息)
【发布时间】:2016-02-22 03:10:36
【问题描述】:

为 node.js 使用了两个不同的库,azure-storagefast-azure-storage,结果相同。

这是我的工作:

  1. 使用默认设置创建消息 - 好的。
  2. 从队列中获取消息 - 好的。
  3. 更新消息以重置visibility timeout - 好的。
  4. 处理后删除消息 - 错误:MessageNotFound。

如果我跳过更新,一切都会顺利。

那么我做错了什么?

附:尝试分析http流量,似乎完全符合docs。就像这是 Azure 内部问题? 也许有人有使用其他语言库更新消息的经验? curl 该服务由于计算 auth 标头太不方便了。

【问题讨论】:

    标签: node.js azure azure-storage azure-storage-queues azure-node-sdk


    【解决方案1】:

    正如文档Delete Message 中提到的,该函数需要popreceipt 参数,该参数由Get MessagesUpdate Message 操作返回。

    并且在更新消息操作后,该消息的popreceipt 会发生变化。因此,如果您编写 sn-p 代码如下所示:

    queueSvc.getMessages('myqueue', function(error, result, response){
      if(!error){
        // Messages retreived
        for(var index in result){
          var message = result[0];
          queueSvc.updateMessage('myqueue', message.messageid, message.popreceipt, 0, {messageText: 'new text'}, function(error, result, response){
              if(!error){
                // Message updated successfully
                console.log('result: '+JSON.stringify(result));
                console.log(message.popreceipt)
                queueSvc.deleteMessage('myqueue', message.messageid, message.popreceipt, function(error, response){
                    if(!error){
                        console.log(response);
                      // Message deleted
                    }else{
                        console.log(error);
                    }
                  });
              }else{
                console.log(error);
              }
            });
        }
      }
    });
    

    你会遇到你的问题,你可以在cmdlet中监控,我们发现popreceipt在更新操作后发生了变化。

    因此,如果您需要在更新操作后删除消息,则必须利用 result 对象,它是更新后的新消息对象。例如

    queueSvc.deleteMessage('myqueue', result.messageid, result.popreceipt, function(error, response){
                if(!error){
                    console.log(response);
                  // Message deleted
                }else{
                    console.log(error);
                }
              });
    

    【讨论】:

    • 谢谢,加里!那是我的猜测。我被fast-azure-storage 误导了,它忽略了新的popreceipt。而且官方模块的队列真的很慢。
    • 顺便说一句,它已经在fast-azure-storage模块中实现了。
    • 是的,看来updateMessage 函数将从source code 返回新的popreceipt
    • 是的,实际上这是在我根据您的回答提出的拉取请求之后 :)
    【解决方案2】:

    “更新消息以重置可见性超时”是什么意思?您是否将隐形超时设置为零?如果是这样,则第 4 步中的错误是预期的,因为您不允许 delete 当前可见的消息。

    【讨论】:

    • 不,我是想再次将其设置为 30 秒。
    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 2019-04-18
    • 1970-01-01
    相关资源
    最近更新 更多