subscriptionClient.AbandonAsyn c против subscriptionClient.closeAsync - PullRequest
0 голосов
/ 22 января 2020

В чем разница между subscriptionClient.AbandonAsyn c против subscriptionClient.closeAsyn c.

Мне нужно проверить, существуют ли topi c в subscriptionClient или нет. Я не могу использовать azure клиент управления из-за некоторых ограничений

Ответы [ 2 ]

0 голосов
/ 23 января 2020

1. В чем разница между subscriptionClient.AbandonAsyn c против subscriptionClient.closeAsyn c.

Согласно моим исследованиям и тестам, метод subscriptionClient.AbandonAsync используется для определения службы шина, что сообщение оставлено, и оно должно обработать сообщение снова. Как только DeliveryCount сообщения достигает MaxDeliveryCount, сообщение перемещается в DLQ с указанием кода причины MaxDeliveryCountExceeded. Для получения более подробной информации, пожалуйста, обратитесь к документу enter image description here

Метод subscriptionClient.closeAsync используется для закрытия subscriptionClient, тогда ваш клиент не может получить сообщение от подписка.

Мой тест:

Код:

namespace CoreReceiverApp
{
    using System;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.Azure.ServiceBus;

    class Program
    {
        const string ServiceBusConnectionString = "<your_connection_string>";
        const string TopicName = "<your_topic_name>";
        const string SubscriptionName = "<your_subscription_name>";
        static ISubscriptionClient subscriptionClient;

        public static async Task Main(string[] args)
        {    
            subscriptionClient = new SubscriptionClient(ServiceBusConnectionString, TopicName, SubscriptionName);

            Console.WriteLine("======================================================");
            Console.WriteLine("Press ENTER key to exit after receiving all the messages.");
            Console.WriteLine("======================================================");

            // Register subscription message handler and receive messages in a loop
            RegisterOnMessageHandlerAndReceiveMessages();

            Console.ReadKey();

            await subscriptionClient.CloseAsync();    
        }

        static void RegisterOnMessageHandlerAndReceiveMessages()
        {
            // Configure the message handler options in terms of exception handling, number of concurrent messages to deliver, etc.
            var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
            {
                // Maximum number of concurrent calls to the callback ProcessMessagesAsync(), set to 1 for simplicity.
                // Set it according to how many messages the application wants to process in parallel.
                MaxConcurrentCalls = 1,

                // Indicates whether MessagePump should automatically complete the messages after returning from User Callback.
                // False below indicates the Complete will be handled by the User Callback as in `ProcessMessagesAsync` below.
                AutoComplete = false
            };

            // Register the function that processes messages.
            subscriptionClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
        }

        static async Task ProcessMessagesAsync(Message message, CancellationToken token)
        {
            // Process the message.
            Console.WriteLine($"Received message: SequenceNumber:{message.SystemProperties.SequenceNumber} Body:{Encoding.UTF8.GetString(message.Body)}");


            // This can be done only if the subscriptionClient is created in ReceiveMode.PeekLock mode (which is the default).
             await subscriptionClient.AbandonAsync(message.SystemProperties.LockToken);
            Console.WriteLine(message.SystemProperties.DeliveryCount);

        }

        static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs)
        {
            Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}.");
            var context = exceptionReceivedEventArgs.ExceptionReceivedContext;
            Console.WriteLine("Exception context for troubleshooting:");
            Console.WriteLine($"- Endpoint: {context.Endpoint}");
            Console.WriteLine($"- Entity Path: {context.EntityPath}");
            Console.WriteLine($"- Executing Action: {context.Action}");
            return Task.CompletedTask;
        }
    }
}

enter image description here

0 голосов
/ 22 января 2020

Есть несколько опций для проверки топи c существует или нет. Я могу представить себе два наиболее распространенных способа:

  1. Использование библиотеки Azure Service Bus SDK с ManagementClient.
  2. Использование Azure Сервис Библиотека управления шинами .

Разница между ними заключается в том, что вы используете для аутентификации вашего кода. С библиотекой SDK вы можете использовать строку подключения или TokenProvider (Managed Identity или другой способ аутентификации). При этом в библиотеке управления вы можете проходить аутентификацию только с помощью Azure Active Directory (требуются идентификатор клиента, идентификатор клиента, секрет клиента, идентификатор подписки и имя группы ресурсов).

В отношении того, что кажется совершенно отдельным вопрос

в чем разница между subscriptionClient.AbandonAsyn c против subscriptionClient.closeAsyn c.

subscriptionClient.AbandonAsync() оставляет сообщение, чтобы другой конкурент мог выбрать это до. Где subscriptionClient.closeAsync() закрывает соединение SubscriptionClient с брокером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...