构建队列处理webjob以从队列中读取消息并使用数据从blob存储中检索报告uri然后将其作为电子邮件中的链接发送。我的流程运行良好,但我需要在特定的时间窗口内发送电子邮件。
我有另一个进程(webjob)从sql后端检索这些数据并将其放在电子邮件队列中。
此webjob每30分钟运行一次,只获取当前时间和当前时间2小时内的数据。所以我知道队列中的任何内容都适用于今天和现在的2小时内#39;我如何进一步缩小范围,以便从队列中读取数据,如果'电子邮件输出'时间设置为19:00,当前时间是18:00,我可以将此消息放回队列中以便稍后再读取,下次应该更接近19:00然后我可以处理它并发送它在电子邮件中 时间不必被点上,所以即使它在内,比如19:00的30分钟(或者它的设置被发送的任何时间)它可以被处理。所以我有效地从队列中取出一个对象,检查它的时间,以及它是否在30分钟内分配给它的电子邮件'时间,我把它放回队列并再次处理
**在我的网络工作中,我有一个'功能'包含方法的类' 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>
答案 0 :(得分:2)
将消息添加到队列时,只需设置initialVisibilityDelay,以便在最短处理时间之前看不到消息。
CloudQueue queue = queueClient.GetQueueReference(queueName);
var msg = new CloudQueueMessage("Hello World!");
TimeSpan timeSpanDelay = GetEarliestProcessTime();
await queue.AddMessageAsync(msg, null, timeSpanDelay, null, null);
答案 1 :(得分:1)
在Azure存储队列中对项目进行编号时,可以向项目添加额外的详细信息,这将导致项目在可配置的持续时间内被隐藏。如果您的批处理作业只能每两个小时运行一次但是您希望延迟发送具有更细粒度时间控制的电子邮件,那么我建议两小时的正在进行的批处理作业可以使用此“initialVisibilityDelay”功能。
这是另一个描述API的SO问题。