簡體   English   中英

azure 隊列存儲 - 將消息放回隊列中

[英]azure queue storage - putting a message back in the queue

我正在構建一個隊列處理 webjob 以從隊列中讀取消息並使用數據從 blob 存儲中檢索報告 uri,然后將其作為電子郵件中的鏈接發送。 我的流程運行良好,但我需要在特定時間范圍內發送電子郵件。

我有另一個進程 (webjob) 從 sql 后端檢索此數據並將其放入電子郵件隊列中。

此網絡作業每 30 分鍾運行一次,僅獲取當天和當前時間的 2 小時窗口內的數據。 所以我知道隊列中的任何內容都適用於今天和“現在”的 2 小時內。 我將如何進一步縮小范圍以從隊列中讀取數據,如果“發送電子郵件”時間設置為 19:00 而當前時間為 18:00,我可以將此消息放回隊列中以讀取它稍后,下次應該更接近 19:00,然后我可以處理它並通過電子郵件發送。
時間不一定要准時,所以即使它在 19:00 的 30 分鍾內(或它設置的發送時間),它也可以被處理。 所以我有效地從隊列中取出一個對象,檢查它的時間,如果它不在分配的“發送電子郵件”時間的 30 分鍾內,我將它放回隊列並再次處理

** 在我的 webjob 中,我有一個“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 類將具有生成時間屬性,我可以讀取它並將其與當前時間進行比較,並且僅當它在我指定的“時間窗口”內時才對其進行處理。 我如何阻止隊列消息在此處被刪除,以便我可以重新處理它?

當您將消息添加到隊列時,只需設置 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

因此,Azure 存儲隊列有一些東西可以幫助你解決這種情況:

關於將消息放回隊列中,您不必做任何特別的事情。 這是存儲隊列提供的一項功能。 當您將消息出列時(Azure 存儲術語中的GET Message ),該消息在一定時間內變得不可見,如果沒有被出列的進程刪除,它將再次變得可見,並且可以被另一個進程接收。

因此,當您將消息出列時,請檢查時間,如果時間不對,您什么也不做。 但是,請確保在處理消息后刪除該消息,否則它將再次被接收。

您可以做的另一件事是,當您將消息出列並發現現在不是處理該消息的正確時間時,您更新該消息並將其可見性超時屬性設置為一個值,該值將使該消息在處理過程中再次可見時間。 例如,您在 18:00 將消息出列,發現該消息需要在 19:00 進行處理。 在這種情況下,您將更新消息並將其可見性超時設置為 50 分鍾(或大於 30 分鍾的值,因為 30 分鍾是您的 Web 作業的計划)。 這將確保當您的 web 作業在 18:30 運行時,該消息不會被 web 作業接收,因為該消息只會在 18:50 時可見。

您可以在此處閱讀有關更新消息的更多信息: https : //docs.microsoft.com/en-us/rest/api/storageservices/update-message以及有關消息出隊的更多信息: https : //docs.microsoft.com/en-我們/rest/api/storageservices/get-messages

更新

我完全忘記了它在 WebJob 中,所以什么都不做實際上會刪除消息。 我想你有 2 個選擇(有點重復評論中提到的內容):

  1. 拋出異常而不是什么都不做。 這將確保 WebJob 處理器不會刪除消息。 我自己沒有嘗試過,但您也可以更新消息並將其可見性超時設置為更接近 WebJob 本身所需時間的值(然后拋出異常)。 不過,這是一種反模式。
  2. 您在隊列中添加一條新消息並將其初始可見性超時設置為更接近所需時間的值(這也包含在另一個答案中),然后刪除此消息。

將 Azure 存儲隊列中的項目加入隊列時,可以向項目添加額外的詳細信息,這將導致項目在可配置的持續時間內隱藏。 如果您的批處理作業只能每兩小時運行一次,但您想延遲發送具有更細粒度時間控制的電子郵件,那么我建議每兩小時排隊的批處理作業可以使用此“initialVisibilityDelay”功能。

這是另一個描述 API 的 SO 問題。

Azure 存儲隊列消息(在特定時間顯示)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM