为通过 Azure 函数输出绑定添加到 Azure 队列的消息设置 VisibilityTimeout
Setting the VisibilityTimeout for a Message added to an Azure Queue via Azure Function Output Binding
我有一个 TimerTrigger 函数,输出绑定是一个 Azure 队列。
我的想法是,每隔 10 分钟,计时器就会 运行,它会查看我的数据库中的一个视图,并遍历所有返回的行,将它们作为消息添加到队列中。
下面是我的示例 TimerTrigger。将消息添加到队列中效果很好。
然而,在我的真实场景中,某些行需要立即执行,而其他行将延迟几分钟(每行不同)。我计划通过对消息使用 VisibilityTimeout 来处理延迟。
不幸的是,通过字符串的绑定不允许我设置值。 CloudQueueMessage.VisiblityTimeout(下面使用)是只读的。
#r "Microsoft.WindowsAzure.Storage"
using System;
using Microsoft.WindowsAzure.Storage.Queue;
public static void Run(TimerInfo myTimer, ICollector<CloudQueueMessage> outputQueueItem, TraceWriter log)
{
log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
//- Add a message to be processed now.
CloudQueueMessage msg = new CloudQueueMessage("Now");
outputQueueItem.Add(msg);
//- Add a message to be processed later.
//- this code below won't work because NextVisibleTime is readonly.
//- is there some way to set the VisibilityTimeout property before queueing?
msg = new CloudQueueMessage("Later");
DateTime otherDate = DateTime.Now.AddMinutes(3);
msg.NextVisibleTime = otherDate;
outputQueueItem.Add(msg);
}
有没有什么方法可以让绑定将消息添加到队列中,并让我根据需要逐条消息设置 VisibilityTimeout 消息?
Azure Functions Storage Queue 的输出绑定只允许我们访问 CloudQueueMessage,不允许我们为消息设置 VisibilityTimeout。
我重写了我的代码以连接到 Azure 存储队列并post手动将消息发送到队列,而不是通过 Azure 函数输出绑定。
见下文。 . .
#r "Microsoft.WindowsAzure.Storage"
using System;
using System.Configuration;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Queue;
public static void Run(TimerInfo myTimer, TraceWriter log)
{
log.Info($"Queue Notifications: {DateTime.Now}, {myTimer.Schedule}, {myTimer.ScheduleStatus}, {myTimer.IsPastDue}");
//* Setup the connection to q-notifications, create it if it doesn't exist.
var connectionString = ConfigurationManager.AppSettings["AzureWebJobsStorage"];
var storageAccount = CloudStorageAccount.Parse(connectionString);
var queueClient = storageAccount.CreateCloudQueueClient();
var queue = queueClient.GetQueueReference("q-notifications");
queue.CreateIfNotExistsAsync();
//* Eventually this will come from iterating through a SQL Database View of messages that need queueing.
//* For testing just show we can add two messages with different Visibilty times.
CloudQueueMessage message;
TimeSpan delay;
//* Queue Message for Immediate Processing.
message = new CloudQueueMessage("Now Message");
queue.AddMessageAsync(message, null, null, null, null);
//* Queue Message for Later Processing.
delay = DateTime.UtcNow.AddMinutes(3) - DateTime.UtcNow;
message = new CloudQueueMessage("Later Message");
queue.AddMessageAsync(message, null, delay, null, null);
//* Queue Message for Even Later Processing.
delay = DateTime.UtcNow.AddMinutes(12) - DateTime.UtcNow;
message = new CloudQueueMessage("Even Later Message");
queue.AddMessageAsync(message, null, delay, null, null);
}
我有一个 TimerTrigger 函数,输出绑定是一个 Azure 队列。
我的想法是,每隔 10 分钟,计时器就会 运行,它会查看我的数据库中的一个视图,并遍历所有返回的行,将它们作为消息添加到队列中。
下面是我的示例 TimerTrigger。将消息添加到队列中效果很好。
然而,在我的真实场景中,某些行需要立即执行,而其他行将延迟几分钟(每行不同)。我计划通过对消息使用 VisibilityTimeout 来处理延迟。
不幸的是,通过字符串的绑定不允许我设置值。 CloudQueueMessage.VisiblityTimeout(下面使用)是只读的。
#r "Microsoft.WindowsAzure.Storage"
using System;
using Microsoft.WindowsAzure.Storage.Queue;
public static void Run(TimerInfo myTimer, ICollector<CloudQueueMessage> outputQueueItem, TraceWriter log)
{
log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
//- Add a message to be processed now.
CloudQueueMessage msg = new CloudQueueMessage("Now");
outputQueueItem.Add(msg);
//- Add a message to be processed later.
//- this code below won't work because NextVisibleTime is readonly.
//- is there some way to set the VisibilityTimeout property before queueing?
msg = new CloudQueueMessage("Later");
DateTime otherDate = DateTime.Now.AddMinutes(3);
msg.NextVisibleTime = otherDate;
outputQueueItem.Add(msg);
}
有没有什么方法可以让绑定将消息添加到队列中,并让我根据需要逐条消息设置 VisibilityTimeout 消息?
Azure Functions Storage Queue 的输出绑定只允许我们访问 CloudQueueMessage,不允许我们为消息设置 VisibilityTimeout。
我重写了我的代码以连接到 Azure 存储队列并post手动将消息发送到队列,而不是通过 Azure 函数输出绑定。
见下文。 . .
#r "Microsoft.WindowsAzure.Storage"
using System;
using System.Configuration;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Queue;
public static void Run(TimerInfo myTimer, TraceWriter log)
{
log.Info($"Queue Notifications: {DateTime.Now}, {myTimer.Schedule}, {myTimer.ScheduleStatus}, {myTimer.IsPastDue}");
//* Setup the connection to q-notifications, create it if it doesn't exist.
var connectionString = ConfigurationManager.AppSettings["AzureWebJobsStorage"];
var storageAccount = CloudStorageAccount.Parse(connectionString);
var queueClient = storageAccount.CreateCloudQueueClient();
var queue = queueClient.GetQueueReference("q-notifications");
queue.CreateIfNotExistsAsync();
//* Eventually this will come from iterating through a SQL Database View of messages that need queueing.
//* For testing just show we can add two messages with different Visibilty times.
CloudQueueMessage message;
TimeSpan delay;
//* Queue Message for Immediate Processing.
message = new CloudQueueMessage("Now Message");
queue.AddMessageAsync(message, null, null, null, null);
//* Queue Message for Later Processing.
delay = DateTime.UtcNow.AddMinutes(3) - DateTime.UtcNow;
message = new CloudQueueMessage("Later Message");
queue.AddMessageAsync(message, null, delay, null, null);
//* Queue Message for Even Later Processing.
delay = DateTime.UtcNow.AddMinutes(12) - DateTime.UtcNow;
message = new CloudQueueMessage("Even Later Message");
queue.AddMessageAsync(message, null, delay, null, null);
}