[英]Not able to set maxMessageBatchSize for Azure Service Bus Queue
[英]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
再次使這更簡單。
使用:
您可以編寫一個清空服務總線隊列或主題/訂閱的方法:
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);
}
我使用ReceiveAndDelete , PrefetchCount , ReceiveBatchAsync和一個簡單的真值循環,而不是使用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用於這兩種方法。
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庫。
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
,它實際上並不從隊列中刪除消息 - 它告訴服務總線接收客戶端想要明確地解決接收到的消息。 鎖定部分意味着競爭接收者在鎖定期間無法訪問消息。
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
或者...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.