azure-storage-queues - 如何检查存储队列是否包含特定消息

标签 azure-storage-queues

我正在为由存储队列触发的 azure 函数编写集成测试,我希望能够检查该函数是否已成功处理消息或将消息移至有害队列。

有没有办法在队列中搜索特定消息而不使消息出队?

我的做法是检索已发送消息的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,但问题是当消息移动到有毒队列,因此 isPoisoned 将始终返回 false

更新:

感谢@gaurav-mantri的建议,我更新了我的方法以使用 PeekMessagesAsync 并在下面添加了我的答案:

最佳答案

Is there any way to search a queue for a specific message, without dequeuing the message?

仅当队列中的消息数小于 32 时才可能。32 是您一次可以查看(或出队)的最大消息数。

如果消息数量小于32条,可以使用QueueClient.PeekMessagesAsync并将您的消息的消息 ID 与返回的消息进行比较。如果找到匹配的消息 ID,则意味着该消息存在于队列中。

关于azure-storage-queues - 如何检查存储队列是否包含特定消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67623080/

相关文章:

c# - 如何获取Azure存储队列大小/位置

azure - Azure 函数中绑定(bind)队列存储消息文本失败

Azure 托管 ID : how to convert azure function from connection string to managed id

azure - 切换到 Azure.Storage.Queues 后 Azure Function 中的模型绑定(bind)问题

azure - 每个函数的hosts.json 设置而不是全局设置

azure - QueueTrigger 属性可见性超时

c# - Azure 存储队列 - 消息 ID

azure - 在队列触发的 Azure Webjobs 中,是否可以在 Webjob 功能失败之后但中毒之前修改 Azure 存储队列消息?

c# - 如何使用 Azure 存储队列发送 XML 文件?

c# - PopReceipt 属性是否保证 CloudQueueMessage 已成功添加到 Azure 存储队列?