我正在构建一个队列处理 Web 作业,以从队列中读取消息并使用数据从 Blob 存储中检索报告 URI,然后将其作为电子邮件中的链接发送。我的流程运行得很好,但我需要在特定的时间范围内发送电子邮件。
我有另一个进程(webjob),它从 SQL 后端检索此数据并将其放入电子邮件队列中。
此网络作业每 30 分钟运行一次,并且仅获取当天以及当前时间 2 小时窗口内的数据。所以我知道队列中的所有内容都是今天以及“现在”后 2 小时内的内容。我如何进一步缩小范围以从队列中读取数据,如果“电子邮件发送”时间设置为 19:00 而当前时间为 18:00,我可以将此消息放回队列中以读取它稍后再说,下次应该接近19:00,这样我就可以处理它并通过电子邮件发送出去。
时间不必准确,因此即使在 19:00 的 30 分钟内(或设置的发送时间),也可以对其进行处理。因此,我有效地从队列中取出一个对象,检查其时间,如果它不在分配的“电子邮件发送”时间的 30 分钟内,我会将其放回队列中并再次进行处理
** 在我的网络作业中,我有一个“Functions”类,其中包含一个“ProcessQueueMessage”方法,每当消息放入队列中时就会触发该方法。
// This function will get triggered/executed when a new message is written
// on an Azure Queue called queue.
public async Task ProcessQueueMessage([QueueTrigger("%reportgenerator%")] Data.Dto.Schedule.ScheduleDto schedule)
{
var reports = await this._scheduledReportGenerationService.GenerateScheduledEmails(schedule.ID);
}
ScheduleDto 类将有一个生成时间属性,我可以读取它并将其与当前时间进行比较,并且仅当它在我指定的“时间窗口”内时才处理它。我如何阻止队列消息被删除,以便我可以重新处理它?</p>
最佳答案
当您将消息添加到队列时,只需设置initialVisibilityDelay,以便在最短处理时间之前不会看到该消息。
CloudQueue queue = queueClient.GetQueueReference(queueName);
var msg = new CloudQueueMessage("Hello World!");
TimeSpan timeSpanDelay = GetEarliestProcessTime();
await queue.AddMessageAsync(msg, null, timeSpanDelay, null, null);
关于c# - azure 队列存储-将消息放回到队列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45629900/