更新后无法删除azure存储队列消息(未找到消息)

时间:2015-11-19 19:43:43

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

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

这就是我的所作所为:

  1. 使用默认设置创建消息 - 确定。
  2. 从队列中获取消息 - 好的。
  3. 更新要重置visibility timeout的消息 - 确定。
  4. 处理后删除邮件 - 错误:MessageNotFound。
  5. 如果我跳过更新,一切顺利。

    那么我做错了什么?

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

2 个答案:

答案 0 :(得分:1)

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

更新消息操作后,此消息的popreceipt会更改。因此,如果您的代码片段如下所示:

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

答案 1 :(得分:0)

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