Метод ProcessMessagesAsync не запускается в подписке служебной шины Azure

Я использую служебную шину Azure для обмена сообщениями между двумя основными веб-API-приложениями .Net. Используя topicClient, я могу отправить сообщение в ABS. Но, однако, при использовании клиента подписки для получения сообщения я столкнулся с этой проблемой.

ProcessMessagesAsync - метод не запускается, пока я не дам "Console.Read ();". Я не могу этого дать, потому что использую веб-API.

Как еще я могу запустить этот метод ProcessMessagesAsync, который отлично читает мое сообщение.

Заранее спасибо.

    public async Task GetMessageFromSubscription()
        {

        subscriptionClient = new SubscriptionClient(ServiceBusConnectionString, TopicName, SubscriptionName);

                RegisterOnMessageHandlerAndReceiveMessages();
                //  Console.Read();  ------- Without this line 

                await subscriptionClient.CloseAsync();
           }

 public void RegisterOnMessageHandlerAndReceiveMessages()
        {
            var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler);
            subscriptionClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
         }


        private async Task ProcessMessagesAsync(Message message, CancellationToken token)
        {
               var messageBody = Encoding.UTF8.GetString(message.Body);
                var serviceBusMessage = JsonConvert.DeserializeObject<WorkIntakeItem>(messageBody);
                await subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);

         }


person user2294434    schedule 17.04.2020    source источник


Ответы (1)


Это цикл, который выполняется по мере выполнения процесса. Когда процесс завершится, обработчик будет остановлен.

Если у вас есть непрерывный поток сообщений, обработчик (он же насос сообщений) - подходящий вариант. Если вам просто нужно получить одно сообщение и выйти, то есть опция блокировки сообщения _ 1_. Вы сами управляете приложением, когда его закрывать.

static IMessageReceiver messageReceiver;
RegisterOnMessageHandlerAndReceiveMessages();
Message message = await messageReceiver.ReceiveAsync();
await messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
await messageReceiver.CloseAsync();
await subscriptionClient.CloseAsync();

Для получения дополнительной информации вы можете обратиться к этому статья.

person Joey Cai    schedule 17.04.2020