Как удалить сообщения для подписки на служебную шину

Просто интересно, как лучше (даже через 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;
    });
Другие вопросы по тегам