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

标签 c# azure azure-queues

我正在构建一个队列处理 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);

CloudQueue.AddMessage

关于c# - azure 队列存储-将消息放回到队列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45629900/

相关文章:

c# - 将调试 View 与 Windows 服务一起使用

azure - 是否可以从 azure 存储队列中获取消息两次?

c# - 将消息添加到 azure 存储队列而不使用base64编码?

c# - 如何在 EF 4.1 中将属性映射为 NOT 列

c# - 具有附加可绑定(bind)字段的 ASP.NET 服务器控件

azure - 模拟 TableClient DeleteEntityAsync - Azure.Response

c# - 如何从访问 token 获取用户详细信息

azure - 如何在 Azure AD B2C 租户中注册 Zendesk 应用程序(基于 SAML)以执行 SSO?

azure - Snowpipe 云消息传递机制在 Azure 上到底如何工作?

c# - 确定 Windows 窗体应用程序中的插入模式