更新后无法删除 azure storage queue 消息(找不到消息)
Can't delete azure storage queue message after it has been updated (Message not found)
为 node.js、azure-storage
和 fast-azure-storage
使用了两个不同的库,结果相同。
这是我的做法:
- 使用默认设置创建消息 - 可以。
- 从 queue 获取消息 - 好的。
- 更新消息以重置
visibility timeout
- 好的。
- 处理后删除邮件 - 错误:MessageNotFound。
如果我跳过更新,一切都会很顺利。
那我做错了什么?
P.S。试着分析了一下http流量,好像完全符合docs。这是 Azure 内部问题吗?
也许有人有使用其他语言库更新消息的经验?由于计算身份验证 header,该服务对 curl
太不方便 header。
你说的 "Update message to reset visibility timeout" 是什么意思?您是否将隐身超时设置为零?如果是这样,则预计会出现第 4 步中的错误,因为您不允许 delete 当前可见的消息。
作为文件Delete Message mentions, the function requires the parameter popreceipt
which is returned by Get Messages or Update 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
对象,它是 updating.E.g.
之后的新消息对象
queueSvc.deleteMessage('myqueue', result.messageid, result.popreceipt, function(error, response){
if(!error){
console.log(response);
// Message deleted
}else{
console.log(error);
}
});
为 node.js、azure-storage
和 fast-azure-storage
使用了两个不同的库,结果相同。
这是我的做法:
- 使用默认设置创建消息 - 可以。
- 从 queue 获取消息 - 好的。
- 更新消息以重置
visibility timeout
- 好的。 - 处理后删除邮件 - 错误:MessageNotFound。
如果我跳过更新,一切都会很顺利。
那我做错了什么?
P.S。试着分析了一下http流量,好像完全符合docs。这是 Azure 内部问题吗?
也许有人有使用其他语言库更新消息的经验?由于计算身份验证 header,该服务对 curl
太不方便 header。
你说的 "Update message to reset visibility timeout" 是什么意思?您是否将隐身超时设置为零?如果是这样,则预计会出现第 4 步中的错误,因为您不允许 delete 当前可见的消息。
作为文件Delete Message mentions, the function requires the parameter popreceipt
which is returned by Get Messages or Update 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
对象,它是 updating.E.g.
queueSvc.deleteMessage('myqueue', result.messageid, result.popreceipt, function(error, response){
if(!error){
console.log(response);
// Message deleted
}else{
console.log(error);
}
});