【发布时间】: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 的方法,并在下面添加了我的答案:
【问题讨论】: