一次性清除天蓝色服务总线队列

bha*_*lad 20 .net queue azure azureservicebus azure-servicebus-queues

我们在项目中使用服务总线队列.当管理员选择清除队列时,我们需要一种功能来从队列中删除所有消息.我在网上搜索但找不到任何在QueueClient课堂上做这个的功能.

我是否必须逐个弹出所有消息,然后将它们标记为完成以清除队列或者有更好的方法吗?

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

BrokeredMessage brokeredMessage = queueClient.Receive();

while (brokeredMessage != null )
{
    brokeredMessage.Complete();
    brokeredMessage = queueClient.Receive();
}
Run Code Online (Sandbox Code Playgroud)

SSD*_*SSD 29

您可以简单地从天蓝色门户执行此操作。

如果您不担心过去 14 天(默认)存储的队列消息并希望立即清除队列,请将消息时间的实时值更改为 5 或 10 秒,然后等待 5-10 秒。

重要步骤:几秒钟后,尝试从队列接收以强制其更新。

所有队列消息将被清除。您可以再次重置原始值。默认为 14 天。

在此输入图像描述


Sco*_*ady 8

Receive()像往常一样使用while循环中的方法将导致代码在队列为空时无限期地运行,因为该Receive()方法将等待队列中出现另一条消息.

如果您希望自动运行,请尝试使用该Peek()方法.

例如:

while (queueClient.Peek() != null)
{
    var brokeredMessage = queueClient.Receive();
    brokeredMessage.Complete();
}
Run Code Online (Sandbox Code Playgroud)

你可以ReceiveMode.ReceiveAndDelete用hocho提到的那样再简单一点.


小智 8

当我读到这个问题时,我首先想到的是为什么不删除并重新创建队列?这可能是一种方法。但如果不想这样做,您可以接收并删除每条消息,直到没有消息为止。

对于这两种方法,都可以使用最新的 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");          
Run Code Online (Sandbox Code Playgroud)

注意: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);
}
Run Code Online (Sandbox Code Playgroud)

ReceiveMode = ServiceBusReceiveMode.ReceiveAndDelete是不言自明的。默认接收模式PeekLock实际上并不从队列中删除消息 - 它告诉服务总线接收客户端想要显式地处理接收到的消息。锁定部分意味着竞争接收者在锁定期间无法访问消息。


Tho*_*mas 6

使用:

您可以编写一个清空服务总线队列或主题/订阅的方法:

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);
}
Run Code Online (Sandbox Code Playgroud)


Ell*_*iot 5

我使用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();
}
Run Code Online (Sandbox Code Playgroud)

仅需要WindowsAzure.ServiceBus Nuget 包。