Служебная шина Azure | Включить сеанс | Сеанс не получает

#azure #azureservicebus #azure-servicebus-queues #azure-servicebus-topics #azure-servicebus-subscriptions

Вопрос:

У меня есть требование обрабатывать один и тот же набор сообщений вместе, и для этого я пытался включить функцию сеансов служебной шины Azure. Чтобы проверить это, я создал очень простое приложение, сообщение успешно отправляется в очередь, однако при попытке получить сообщение в функции «ReceiveSessionMessage» сеанс сообщения не возвращается, и программа завершает работу после этой строки.

Я не в состоянии выяснить точную первопричину, любая помощь была бы очень признательна. Спасибо

[var MessageSession = ожидание сеанса.AcceptMessageSessionAsync();]

Программа

 using Microsoft.Azure.ServiceBus;
using System;
using System.Text;
using System.Threading.Tasks;

namespace TestSendReceiveMessagesAzure
{
    class Program
    {
        static string connectionString = "";
        static string queueName = "demosessionqueue";

        static void Main(string[] args)
        {
            Console.WriteLine("Test Service Bus Session! enable feature");
            SendMessage();
            Console.WriteLine("Message Pushed");
            ReceiveSessionMessage();
        }

        private static void SendMessage()
        {
            QueueClient queueClilent = new QueueClient(connectionString, queueName, ReceiveMode.PeekLock);
            string msgJson = "{PizzaType:Veggie,SessionID:SessionId0101}";
            Message message = new Message(Encoding.UTF8.GetBytes(msgJson))
            {
                SessionId = "SessionId0101"
            };
            Console.WriteLine(msgJson);
            queueClilent.SendAsync(message).Wait();
        }

        private static async Task ReceiveSessionMessage()
        {
            var sessionClient = new SessionClient(connectionString, queueName, ReceiveMode.PeekLock);
            Console.WriteLine("Accepting a message session...");
            try
            {
                var messageSession = await sessionClient.AcceptMessageSessionAsync();
                Console.WriteLine($"Message.SessionID={messageSession.SessionId}");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
        }
    }
}
 

Вывод на консоль

введите описание изображения здесь

Комментарии:

1. Пожалуйста, ознакомьтесь с примером кода здесь: github.com/Azure/azure-sdk-for-net/blob/main/sdk/servicebus/.

2. Спасибо! @GauravMantri за ваш ответ. Я попробовал тот, которым вы поделились, и вызвал его из программы, и это привело к той же проблеме. Позже я обнаружил, что это проблема с понятиями асинхронности и ожидания, которые я объяснил в ответе.

Ответ №1:

Проблема заключается в объявлении

статическая пустота Main(строка[] args) и вызывающий метод «ReceiveSessionMessage()» в нем. Правильный способ вызова этой функции из Program.cs был

   static async Task Main(string[] args)
    {

        Console.WriteLine("Message Session Handler..");
        await MessageSessionReceiver();
    }
 

Функция» ReceiveSessionMessage » была асинхронной функцией, и вызывающая функция не имела упомянутого ключевого слова await, из-за которого программа вышла. После изменения синтаксиса, чтобы добавить ожидание, это сработало.