Сервисная шина Azure "ReceiveAsync" - PullRequest
0 голосов
/ 21 мая 2018

Есть ли способ, используя пакет Microsoft.Azure.ServiceBus, подождать в вашем текущем потоке, чтобы получить сообщение из очереди?

Возможно, это проблема моего понимания и желания использоватьэта технология не предназначена для использования, но я хотел бы объединить примеры отправки и получения из следующего примера Microsoft , чтобы вы могли отправлять сообщения в различные очередии быть в состоянии прослушивать и обрабатывать «ответы» (только сообщения, которые вы слушаете в очереди) и закрывать соединение, когда вы закончите получать сообщения.

Некоторые псевдокоды здесь:

   // send message(s) that will be consumed by other processes / applications, and by doing so later on we will expect some messages back
   await SendMessagesAsync(numberOfMessages);

    var receivedMessages = 0;
    while (receivedMessages < numberOfMessages)
    {
        // there is no "ReceiveAsync" method, this is what I would be looking for
        Message message = await queueClient.ReceiveAsync(TimeSpan.FromSeconds(30));
        receivedMessages++;

        // do something with the message here
   }

   await queueClient.CloseAsync();

Возможно ли это или я "делаю это неправильно"?

Ответы [ 2 ]

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

В библиотеке Microsoft.Azure.ServiceBus нет такого понятия, как ReceiveAsync.При этом вы можете обработать или получить сообщение, используя RegisterOnMessageHandlerAndReceiveMessages().При этом вы можете получить сообщение с событием.С этим RegisterOnMessageHandlerAndReceiveMessages() подобно queueClient.RegisterMessageHandler(ReceiveOrProcessMessagesAsync, messageHandlerOptions);, и вы должны отдельно создать это событие для receiveMessages, в нашем случае это ReceiveOrProcessMessagesAsync

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

        // Complete the message so that it is not received again.
        // This can be done only if the queueClient is created in ReceiveMode.PeekLock mode (which is default).
        await queueClient.CompleteAsync(message.SystemProperties.LockToken);

        // Note: Use the cancellationToken passed as necessary to determine if the queueClient has already been closed.
        // If queueClient has already been Closed, you may chose to not call CompleteAsync() or AbandonAsync() etc. calls 
       // to avoid unnecessary exceptions.
    }

, и вы обратитесь по ссылке ниже для получения информации о Microsoft.Azure.ServiceBus https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-get-started-with-queues

0 голосов
/ 21 мая 2018

В новой библиотеке ReceiveAsync метод доступен в MessageReceiver классе:

var messageReceiver = new MessageReceiver(SBConnString, QueueName, ReceiveMode.PeekLock);
Message message = await messageReceiver.ReceiveAsync();

См. Полный пример на Начало отправки и получения сообщений из очередей служебной шины с использованием MessageSender и MessageReceiver.

...