簡體   English   中英

如何延遲 Azure 服務總線消息?

[英]How to defer a Azure Service Bus message?

目前我使用Microsoft.Azure.ServiceBus.IQueueClientRegisterMessageHandler ,然后我收到的消息是Microsoft.Azure.ServiceBus.Message類型。

根據文檔

消息延遲 API API 在 .NET Framework 客戶端中是 BrokeredMessage.Defer 或 BrokeredMessage.DeferAsync,在 .NET Standard 客戶端中是 MessageReceiver.DeferAsync,在 Java 客戶端中是 IMessageReceiver.defer 或 IMessageReceiver.deferAsync。

...但這些庫中沒有一個與我實際使用的類相關。 我如何推遲? 為了能夠延遲消息,我必須使用哪些類和東西? 上面的所有示例都沒有提供足夠的代碼片段來解釋它。

根據@Gaurav 的要求進行更新

從您的回答中,我可以看到我的消息具有該屬性:

message.ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddHours(1);

queueClient也有這個方法:

queueClient.ScheduleMessageAsync(message, DateTime.UtcNow.AddHours(1));

我將嘗試“ scheduledMessageAsync ”,因為我看不到如何在不調用queueClient情況下傳達我已設置ScheduledEnqueueTimeUtc

Microsoft.Azure.ServiceBus.Message有一個名為ScheduledEnqueueTimeUtc的屬性。 以后當您希望消息出現在隊列中時,只需將此屬性的值設置為日期/時間值即可。 消息將隱藏到那個時間,並且只會在該日期/時間出現在隊列中。

更新

所以我運行了一個測試並確認ScheduledEnqueueTimeUtcScheduleMessageAsync有效。 我為Microsoft.Azure.ServiceBus SDK 使用了4.1.1版。

這是我寫的代碼:

    static void Main(string[] args)
    {
        var connectionString = "my-connection-string";
        var queueName = "test";
        QueueClient queueClient = new QueueClient(connectionString, queueName);
        Message msg1 = new Message()
        {
            Body = Encoding.UTF8.GetBytes("This message has ScheduledEnqueueTimeUtc property set. It will appear in queue after 2 minutes. Current date/time is: " + DateTime.Now),
            ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddMinutes(2)
        };
        queueClient.SendAsync(msg1).GetAwaiter().GetResult();
        Message msg2 = new Message()
        {
            Body = Encoding.UTF8.GetBytes("This message is sent via ScheduleMessageAsync method. It will appear in queue after 2 minutes. Current date/time is: " + DateTime.Now)
        };
        queueClient.ScheduleMessageAsync(msg2, new DateTimeOffset(DateTime.UtcNow.AddMinutes(2))).GetAwaiter().GetResult();
        Console.ReadLine();
    }

這就是我在Peek-Lock模式下獲取消息時看到的內容:

在此處輸入圖片說明

使用 BrokeredMessage.Defer 或 BrokeredMessage.DeferAsync 等消息延遲 API 將延遲消息。

延遲消息會將消息的狀態從 Active 更改為 Deferred 稍后可以根據序列號檢索該消息。

ScheduleMessageAsync()用於調度消息的傳遞(在指定時間發送消息)。 收到消息后無法使用。

我已經編寫了我正在尋找的解決方案,這里是基本大綱:

在異步方法中(運行自己的線程)

public async Task InitialiseAndRunMessageReceiver()

啟動讀取消息的無限循環

receiver = new MessageReceiver(serviceBusConnectionString, serviceBusQueueName, ReceiveMode.PeekLock); 
while (true) { var message = await receiver.ReceiveAsync(); ... more code... }

一旦你知道你即將開始你的長期任務,推遲消息,但存儲message.SystemProperties.SequenceNumber 這將它保留在隊列中,但防止它被重新交付。

await receiver.DeferAsync(message.SystemProperties.LockToken);

當您最終使用message.SystemProperties.SequenceNumber再次請求消息時,並完成消息,就好像它沒有被延遲一樣

var message = receiver.ReceiveDeferredMessageAsync(message.SystemProperties.SequenceNumber);
receiver.CompleteAsync(message.Result.SystemProperties.LockToken);

並且您的消息將從隊列中刪除。

我的大部分困惑是由於庫的名稱相似且生命周期重疊造成的。

Microsoft.Azure.ServiceBus.Core.MessageReceiver是上面的消息接收器

老問題,但適合我的情況是刪除消息並使用 ScheduleMessageAsync 發布副本(某處有復制方法)。 然后消息會在所需的時間返回。

暫無
暫無

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

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