【问题标题】:How to check if a storage queue contains a specific message如何检查存储队列是否包含特定消息
【发布时间】:2021-07-30 02:13:47
【问题描述】:

我正在为由存储队列触发的 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 如果消息尚未被函数拾取并且仍在“处理”中,但问题是当消息移动到毒队列时 messageId 会发生变化,所以 @ 987654325@ 将始终返回 false

更新:

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

【问题讨论】:

    标签: azure-storage-queues


    【解决方案1】:

    有没有什么方法可以在队列中搜索特定消息,而无需 将消息出队?

    只有在您的队列中的消息数量少于 32 条时才有可能。32 是您一次可以查看(或出列)的最大消息数量。

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

    【讨论】:

    • 谢谢,当消息移动到毒队列时,messageId 会发生变化,但我设法在正文上进行了比较
    【解决方案2】:

    感谢@gaurav-mantri 的建议,我更新了使用 PeekMessagesAsync 的方法

    public async Task<bool> IsMessageInQueue(BinaryData body, string queueName)
    {
        var client = new QueueClient(_storageConnectionString, queueName);
        var messages = await client.PeekMessagesAsync();
        return messages.Value.Any(x => x.Body.ToString().Equals(body.ToString()));
    }
    

    这就是用法……

    var queueMessage = JsonConvert.SerializeObject("hi");
    var sendMessageResponse = await client.SendMessageAsync(queueMessage);
    
    var isProcessing = IsMessageInQueue(new BinaryData(queueMessage), "processing");
    var isPoisoned = IsMessageInQueue(new BinaryData(queueMessage), "processing-poison");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-18
      • 2018-11-23
      • 1970-01-01
      • 2023-04-08
      • 2014-10-15
      • 2012-09-14
      • 1970-01-01
      • 2020-05-24
      相关资源
      最近更新 更多