topics topic porta net example .net azure queue azureservicebus azure-servicebus-queues

.net - topic - Borrado de la cola del bus del servicio azul de una sola vez



porta azure (6)

Estamos utilizando una cola de bus de servicio en nuestro proyecto. Necesitamos una funcionalidad para eliminar todos los mensajes de la cola cuando el administrador elige borrar la cola. Busqué en la red pero no pude encontrar ninguna función que haga esto dentro de la clase QueueClient .

¿Tengo que hacer estallar todos los mensajes uno por uno y luego marcarlos como completos para borrar la cola o hay una mejor manera?

QueueClient queueClient = _messagingFactory.CreateQueueClient( queueName, ReceiveMode.PeekLock); BrokeredMessage brokeredMessage = queueClient.Receive(); while (brokeredMessage != null ) { brokeredMessage.Complete(); brokeredMessage = queueClient.Receive(); }


Estoy ReceiveAndDelete buenos resultados con una combinación de ReceiveAndDelete , PrefetchCount , ReceiveBatchAsync y un simple bucle de verdad en lugar de usar Peek. Ejemplo con MessagingFactory a continuación:

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(); }

Solo requiere el paquete WindowsAzure.ServiceBus Nuget.


Hay un método simple Clear() para borrar toda la cola si está utilizando la biblioteca WindowsAzure.Storage de nuget. Yo uso la clase Microsoft.Windows.Azure.Queue de esa biblioteca para administrar la cola. De lo contrario, puede acceder a través de su API por su documentación . No sé cuánto tiempo ha estado el método en la biblioteca de Azure y probablemente no existió cuando se formuló la pregunta originalmente, pero la API REST se remonta al menos a 2014 según esta publicación de comentarios de Azure

El código .NET completo para borrar la cola con la biblioteca de Azure es:

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();


La forma más rápida de limpiar una cola de Azure ServiceBus es establecer un DefaultMessageTimeToLive muy corto, espere unos segundos, intente recibir de la cola para forzar la actualización y luego restaure el DefaultMessageTimeToLive inicial.

Puedes hacerlo desde el portal o desde el código:

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;


Para Azure-ServiceBus-Queues hay un ReceiveBatch-method que le permite recibir un lote de n mensajes en ese momento. Combinado con ReceiveMode.ReceiveAndDelete puede borrar la cola de manera más eficiente.

Advertencia El número n de mensajes puede devolverse, pero no está garantizado. También hay un límite para el tamaño de lote de mensajes de 256K .


Usar el método Receive() dentro del bucle while como usted hará que su código se ejecute indefinidamente una vez que la cola esté vacía, ya que el método Receive() esperará a que aparezca otro mensaje en la cola.

Si desea que esto se ejecute automáticamente, intente usar el método Peek() .

Por ejemplo:

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

Puede hacer esto más simple nuevamente con ReceiveMode.ReceiveAndDelete como lo mencionó hocho.


Utilizando :

  • Ambos enfoques (desde @ScottBrady y @participant)
  • Y la abstracción de MessageReceiver

puede escribir un método que vacíe una cola de bus de servicio o un tema / suscripción:

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); }