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 天。
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。
AdministrationClientusing 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库。
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实际上并不从队列中删除消息 - 它告诉服务总线接收客户端想要显式地处理接收到的消息。锁定部分意味着竞争接收者在锁定期间无法访问消息。
使用:
您可以编写一个清空服务总线队列或主题/订阅的方法:
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)
我使用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();
}
Run Code Online (Sandbox Code Playgroud)
仅需要WindowsAzure.ServiceBus Nuget 包。
| 归档时间: |
|
| 查看次数: |
19517 次 |
| 最近记录: |