azure队列存储-将消息放回队列中

vhmi4jdf  于 2023-01-14  发布在  其他
关注(0)|答案(3)|浏览(131)

我正在建立一个队列处理webjob从队列中读取消息,并使用数据从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类将有一个生成时间属性,我可以读取此属性并将其与当前时间进行比较,只有当它在我指定的“时间窗口”内时才能处理它。如何阻止队列消息在此处被删除,以便我可以重新处理它?

ycl3bljg

ycl3bljg1#

当您将消息添加到队列中时,只需设置initialVisibilityDelay,以便在最短处理时间之前看不到消息。

CloudQueue queue = queueClient.GetQueueReference(queueName);
var msg = new CloudQueueMessage("Hello World!");
TimeSpan timeSpanDelay = GetEarliestProcessTime();
await queue.AddMessageAsync(msg, null, timeSpanDelay, null, null);

CloudQueue.AddMessage

t5zmwmid

t5zmwmid2#

因此,Azure存储队列的一些功能将帮助您处理此场景:
关于将消息放回队列,你不必执行任何特殊操作。这是存储队列提供的一个功能。当你将消息出队时(Azure存储术语中的GET Message),消息在一定时间内不可见,如果出队的进程没有删除消息,则消息将再次可见,并可以由另一个进程拾取。
因此,当您将邮件出队时,请检查时间,如果时间不正确,则不执行任何操作。但是,请确保在处理邮件后删除该邮件,否则它将再次被选中。
您还可以做的一件事是,当您将消息出队并发现处理该消息的时间不合适时,更新该消息并将其可见性超时属性设置为一个值,该值将使消息在接近处理时间时再次可见。例如,您在18:00将消息出队,并发现此消息需要在19:00处理。在这种情况下,您将更新消息并将其可见性超时设置为50分钟(或大于30分钟的值,因为30分钟是Web作业的调度)。这样做的目的是确保当您的Web作业在18:30运行时,Web作业不会拾取此消息,因为此消息仅在18:50才可见。
您可以在此处阅读有关更新消息的更多信息:https://learn.microsoft.com/en-us/rest/api/storageservices/update-message和有关消息出队的信息,请单击此处:https://learn.microsoft.com/en-us/rest/api/storageservices/get-messages.

    • 更新**

我完全忘记了这是在一个WebJob中,所以什么都不做实际上会删除消息。我猜你有两个选择(有点重复评论中提到的):
1.抛出一个异常而不是什么都不做。这将确保WebJob处理器不会删除消息。我自己没有尝试过,但您也可以更新消息并将其可见性超时设置为更接近WebJob本身所需时间的值(然后抛出一个异常)。尽管这是一种反模式。
1.您在队列中添加一条新消息,并将其初始可见性超时设置为一个更接近所需时间的值(这也在另一个答案中涉及),然后删除该消息。

kyks70gy

kyks70gy3#

在Azure存储队列中将项目入队时,可以向项目添加额外的详细信息,这将导致项目在可配置的持续时间内隐藏。如果您的批处理作业只能每两小时运行一次,但您希望通过更细粒度的时间控制来延迟发送电子邮件,那么我建议每两小时入队的批处理作业可以使用此“initialVisibilityDelay”功能。
下面是描述API的另一个SO问题。
Azure storage queue message (show at specific time)

相关问题