簡體   English   中英

清除 azure 服務總線隊列 go

[英]Clearing azure service bus queue in one go

我們在項目中使用服務總線隊列。 當管理員選擇清除隊列時,我們需要一種功能來從隊列中刪除所有消息。 我在 .net 上搜索但找不到在QueueClient class 中執行此操作的任何 function。

我是否必須一條一條地彈出所有消息,然后將它們標記為完成以清除隊列,還是有更好的方法?

QueueClient queueClient = _messagingFactory.CreateQueueClient(
                              queueName, ReceiveMode.PeekLock);

BrokeredMessage brokeredMessage = queueClient.Receive();

while (brokeredMessage != null )
{
    brokeredMessage.Complete();
    brokeredMessage = queueClient.Receive();
}

像往常一樣在while循環中使用Receive()方法將導致代碼在隊列為空時無限期地運行,因為Receive()方法將等待另一條消息出現在隊列中。

如果您希望自動運行,請嘗試使用Peek()方法。

例如:

while (queueClient.Peek() != null)
{
    var brokeredMessage = queueClient.Receive();
    brokeredMessage.Complete();
}

您可以使用hocho提到的ReceiveMode.ReceiveAndDelete再次使這更簡單。

您可以簡單地從 azure 門戶執行此操作。

如果您不擔心過去 14 天(默認)存儲的隊列消息並想立即清除隊列,則將消息生存時間值更改為 5 或 10 秒並等待 5-10 秒。

重要步驟:幾秒鍾后,嘗試從隊列接收以強制其更新。

所有隊列消息將被清除。 您可以再次重置原始值。 默認為 14 天。

在此處輸入圖片說明

使用:

  • 兩種方法(來自@ScottBrady和@participant)
  • MessageReceiver抽象

您可以編寫一個清空服務總線隊列或主題/訂閱的方法:

MessageReceiver messageReceiver = ...
while (messageReceiver.Peek() != null)
{
    // Batch the receive operation
    var brokeredMessages = messageReceiver.ReceiveBatch(300);

    // Complete the messages
    var completeTasks = brokeredMessages.Select(m => Task.Run(() => m.Complete())).ToArray();

    // Wait for the tasks to complete. 
    Task.WaitAll(completeTasks);
}

我使用ReceiveAndDeletePrefetchCountReceiveBatchAsync和一個簡單的真值循環,而不是使用Peek,結果很好。 下面的MessagingFactory示例:

var receiverFactory = MessagingFactory.CreateFromConnectionString("ConnString");
var receiver = receiverFactory.CreateMessageReceiver("QName", ReceiveMode.ReceiveAndDelete);
receiver.PrefetchCount = 300;

bool loop = true;
while (loop)
{
    var messages = await receiver.ReceiveBatchAsync(300, TimeSpan.FromSeconds(1));
    loop = messages.Any();
}

只需要WindowsAzure.ServiceBus Nuget包。

對於Azure-ServiceBus-Queues,有一個ReceiveBatch -method ,它允許您當時接收一批n- message。 結合ReceiveMode.ReceiveAndDelete您可以更有效地清除隊列。

警告可能會返回消息數n ,但不能保證。 此外,郵件批量大小限制為256K

清理Azure ServiceBus隊列的最快方法是設置一個非常短的DefaultMessageTimeToLive ,等待幾秒鍾,嘗試從隊列接收強制它更新然后恢復初始DefaultMessageTimeToLive

您可以從門戶網站或代碼中執行此操作:

var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
var queueDescription = _namespaceManager.GetQueue(queueName);
var queueClient = QueueClient.CreateFromConnectionString(connectionString, queueName, ReceiveMode.ReceiveAndDelete);

var dl = queueDescription.EnableDeadLetteringOnMessageExpiration;
var ttl = queueDescription.DefaultMessageTimeToLive;

queueDescription.EnableDeadLetteringOnMessageExpiration = false;
queueDescription.DefaultMessageTimeToLive = TimeSpan.FromSeconds(1);

Thread.Sleep(5000);
var dumy = queueClient.ReceiveBatch(200, TimeSpan.FromSeconds(1)).ToArray();

queueDescription.EnableDeadLetteringOnMessageExpiration = dl;
queueDescription.DefaultMessageTimeToLive = ttl;

如果您使用的是來自nuget的WindowsAzure.Storage庫,則有一個簡單的Clear()方法可以清除整個隊列。 我使用該庫中的Microsoft.Windows.Azure.Queue類來管理隊列。 否則,您可以根據其文檔通過其API訪問。 我不知道該方法在Azure庫中存在多長時間,並且在最初詢問問題時它可能不存在,但REST API至少源自2014年Azure反饋帖子的 2014年

使用Azure庫清除隊列的完整.NET代碼是:

string connectionString = "YourAzureConnectionStringHere";
string queueName = "YourWebJobQueueName";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

// Create the queue client, then get a reference to queue
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
queue = queueClient.GetQueueReference(GetQueueName(queueName));

// Clear the entire queue
queue.Clear();

當我讀到這個問題時,我首先想到的是為什么不刪除並重新創建隊列? 這可能是一種方法。 但如果不想這樣做,您可以接收和刪除每條消息,直到沒有消息為止。

您可以將最新的 Azure 服務總線 .NET 庫Azure.Messaging.ServiceBus用於這兩種方法。

  1. 使用AdministrationClient刪除和重新創建隊列
using Azure.Messaging.ServiceBus.Administration;

ServiceBusAdministrationClient adminClient = new ServiceBusAdministrationClient("<connectionstring>");
await adminClient.DeleteQueueAsync("myqueue");          
await adminClient.CreateQueueAsync("myqueue");          

注意: ServiceBusAdministrationClient用於對現有服務總線命名空間的 CRUD 操作。 如果您還需要能夠創建命名空間,請改用Microsoft.Azure.Management.ServiceBus庫。

  1. 接收和刪除直到沒有消息
using Azure.Messaging.ServiceBus;

await using var client = new ServiceBusClient("<connectionstring>");
                
ServiceBusReceiver receiver = client.CreateReceiver("myqueue", 
    new ServiceBusReceiverOptions { ReceiveMode = ServiceBusReceiveMode.ReceiveAndDelete });

while ((await receiver.PeekMessageAsync()) != null)
{
    // receive in batches of 100 messages.
    await receiver.ReceiveMessagesAsync(100);
}

ReceiveMode = ServiceBusReceiveMode.ReceiveAndDelete是不言自明的。 默認接收模式是PeekLock ,它實際上並不從隊列中刪除消息 - 它告訴服務總線接收客戶端想要明確地解決接收到的消息。 鎖定部分意味着競爭接收者在鎖定期間無法訪問消息。

  1. 使用隊列服務 REST API(未測試)。

Clear Messages 操作刪除指定隊列中的所有消息

刪除https://myaccount.queue.core.windows.net/myqueue/messages

只有帳戶所有者可以調用此操作。

附言。 URL 好像是錯誤的。 試試這個: https://myaccount.servicebus.windows.net/myqueue/messages

來源: https://learn.microsoft.com/en-us/rest/api/storageservices/clear-messages

或者...

  1. 創建一個邏輯應用程序以在循環中一條一條地刪除消息(已測試)。

在此處輸入圖像描述

暫無
暫無

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

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