[英]How to defer a Azure Service Bus message?
目前我使用Microsoft.Azure.ServiceBus.IQueueClient
到RegisterMessageHandler
,然后我收到的消息是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
的屬性。 以后當您希望消息出現在隊列中時,只需將此屬性的值設置為日期/時間值即可。 消息將隱藏到那個時間,並且只會在該日期/時間出現在隊列中。
更新
所以我運行了一個測試並確認ScheduledEnqueueTimeUtc
和ScheduleMessageAsync
有效。 我為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.