azure-storage-queues - 如何检查存储队列是否包含特定消息
问题描述
我正在为存储队列触发的天蓝色函数编写集成测试,我希望能够检查该函数是否已成功处理消息或将消息移动到毒队列。
有什么方法可以在队列中搜索特定消息,而不使消息出队?
我的做法是检索已发送消息的messageId和popReceipt,然后尝试更新消息,如果找不到则抛出异常。
public async Task<bool> IsMessageInQueue(string messageId, string popReceipt, string queueName)
{
try
{
var client = new QueueClient(_storageConnectionString, queueName);
_ = client.UpdateMessageAsync(messageId, popReceipt);
return true; //exists in queue
}
catch (Exception)
{
return false; //doesn't exist in queue
}
}
进而
var sendMessageResponse = await client.SendMessageAsync(queueMessage);
var messageId = sendMessageResponse.Value.MessageId;
var popReceipt = sendMessageResponse.Value.PopReceipt;
var isProcessing = IsMessageInQueue(messageId, popReceipt, "processing");
var isPoisoned = IsMessageInQueue(messageId, popReceipt, "processing-poison");
isProcessing
如果消息尚未被函数拾取并且仍在“处理”中,则返回 true,但问题是消息在移动到毒队列时会更改 messageId,因此isPoisoned
将始终返回 false
更新:
感谢@gaurav-mantri的建议,我更新了使用 PeekMessagesAsync 的方法,并在下面添加了我的答案:
解决方案
有什么方法可以在队列中搜索特定消息,而不使消息出队?
仅当队列中的消息数少于 32 时才有可能。32 是您一次可以查看(或出列)的最大消息数。
如果消息数量少于 32 条,您可以使用QueueClient.PeekMessagesAsync
消息的消息 ID 并将其与返回的消息进行比较。如果您找到匹配的消息 ID,则表示该消息存在于队列中。
推荐阅读
- regex - 正则表达式排除特定字符
- javascript - Content Script - Empty Response from Regular Axios Call in Chrome Extension
- pandas - How to change the order of columns in a pandas Dataframe
- azure - TAI for MS Azure with Websphere Application Server v9 CWWSS8017E:身份验证错误
- php - Images not loading on page when I call the view using a different model function
- python - RGB 图像的像素强度以及如何将其与整数相乘以查看灰度阴影
- powershell - 为什么输出会根据我的命令之前的内容而有所不同
- tensorflow - 在 tensorflowjs_converter 中替代 tf_frozen_model
- python - 在 Python2 中,如何强制子类方法调用父方法而不明确要求最终用户包含它?
- nix - nix-env:了解活动 Nix 表达式中的可用属性路径