1

对node.js使用两个不同的库,azure-storagefast-azure-storage,得到相同的结果。更新后不能删除天蓝色的存储队列消息(消息未找到)

这是我做的:

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

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

那么我在做什么错了?

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

回答

1

如文档Delete Message所述,该功能需要参数popreceipt,该参数由Get MessagesUpdate Message操作返回。

并且在更新消息操作之后,该消息的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); 
      } 
      }); 
+0

谢谢,加里!这是我的猜测。 我被'fast-azure-storage'误导了,它忽略了新的'popreceipt'。队伍中的官方模块非常慢。 –

+0

顺便说一下,它已经在'fast-azure-storage'模块中实现了。 –

+1

是的,看起来'updateMessage'函数会从[源代码]中返回新的'popreceipt'(https://github.com/taskcluster/fast-azure-storage/blob/master/lib/queue.js# L897) –

0

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

+0

不,我打算再次将其设置为30秒。 –