Как удалить сообщения для подписки на служебную шину
Просто интересно, как лучше (даже через Portal, Powershell или C#) удалить сообщения из подписки на тему служебной шины.
Представьте, что у нас есть тема с 4 подписками, и мы хотим удалить сообщения только из одной подписки.
У меня есть ощущение, что единственный способ - читать сообщения в цикле, но надеяться на что-то лучшее.
ОБНОВИТЬ:
Помимо использования кода, вы можете использовать обозреватель сервера, как предлагается в ответе - щелкните правой кнопкой мыши подписку и удалите сообщения:
3 ответа
Вы наверняка можете сделать это с помощью кода. Если вы используете Service Bus SDK
Вы можете сделать что-то вроде следующего:
static void PurgeMessagesFromSubscription()
{
var connectionString = "Endpoint=sb://account-name.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=access key";
var topic = "topic-name";
var subscription = "subscription-name";
int batchSize = 100;
var subscriptionClient = SubscriptionClient.CreateFromConnectionString(connectionString, topic, subscription, ReceiveMode.ReceiveAndDelete);
do
{
var messages = subscriptionClient.ReceiveBatch(batchSize);
if (messages.Count() == 0)
{
break;
}
}
while (true);
}
Этот код будет извлекать сообщения из подписки (по 100 за раз) в Receive & Delete
режим, так что как только сообщения извлекаются, они автоматически удаляются из подписки.
я верю Service Bus Explorer
Инструмент также имеет возможность удалять сообщения. Вы также можете использовать это вместо написания кода.
Если у вас много сообщений и вы допускаете небольшое время простоя на стороне подписчика, может быть быстрее просто отказаться от подписки и создать новую с тем же именем.
Спасибо @Gaurav Mantri, я использовал слегка измененный код без пакетной опции с версией 5.2.0 пакета Microsoft.Azure.ServiceBus Nuget:
var connectionString = "Endpoint=sb://";
var topic = "topic";
var subscription = "subscription";
var subscriptionClient = new SubscriptionClient(connectionString, topic, subscription, ReceiveMode.ReceiveAndDelete);
subscriptionClient.RegisterMessageHandler(
(message, token) =>
{
Console.WriteLine($"Received message: SequenceNumber:
{message.SystemProperties.SequenceNumber}");
return Task.CompletedTask;
},
(exceptionEvent) =>
{
Console.WriteLine("Exception = " + exceptionEvent.Exception);
return Task.CompletedTask;
});