我正在使用Microsoft.WindowsAzure.Storage.Queue库通过以下代码将消息从Azure函数推送到存储队列:
public void Enqueue(MyMessage myMessage)
{
string originalPayload = null;
try
{
payload = serializer.Serialize(myMessage);
var message = new CloudQueueMessage(payload);
cloudQueue.AddMessage(message);
}
catch (Exception ex)
{
throw ex;
}
}
这适用于小批量,但是每5分钟处理大约200条消息时,即使该函数永不失败并且在所有尝试中均显示为成功,但几乎有一半的消息不会进入队列。
因此,我想在推送消息后添加一个验证步骤,我在想是否只有PopReceipt检查会起作用:
if ( string.IsNullOrWhitespace(message.PopReceipt) )
{
// the message was not added, do something
}
答案 0 :(得分:1)
队列服务的弹出式收据功能是开发人员轻松识别排队的消息以进行进一步处理的好工具。在“ 2016-05-31”版本之前,仅当用户从队列中获取消息时才能检索弹出收据值。为简化此操作,“放置消息”(又称“添加消息”)响应中提供了“现在弹出收据”值,该值使用户可以更新/删除消息,而无需先检索消息。
下面是一个简短的代码段,它使用针对.NET的Azure存储客户端库8.0来利用此新功能。
// create initial message
CloudQueueMessage message = new CloudQueueMessage("");
queue.AddMessage(message, null, TimeSpan.FromSeconds(180));
//message.PopReceipt is now populated, and only this client can operate on the message until visibility timeout expires
.
.
.
// update the message (now no need to receive the message first, since we already have a PopReceipt for the message)
message.SetMessageContent("");
queue.UpdateMessage(message, TimeSpan.FromSeconds(180), MessageUpdateFields.Content | MessageUpdateFields.Visibility);
// remove the message using the PopReceipt before any other process sees it
await queue.DeleteMessageAsync(message.Id, message.PopReceipt);
这是相同的github回购
答案 1 :(得分:1)
是的,您可以执行验证检查以确定邮件是否已成功添加到队列中。
在构造CloudMessage var message = new CloudQueueMessage(payload);
时,除AsString和AsBytes之外的所有其他属性都将为null。因此,您可以使用“ Id”或“ PopReceipt”之类的属性,这些属性会在邮件成功添加到队列中进行验证时填充。
还要确保您的azure函数是否如前所述每5分钟触发200次,如果消息到达时未触发您的函数,则问题在于azure函数。