Сервисная шина Azure в .Net Core - как получить только одно сообщение - PullRequest
0 голосов
/ 20 мая 2018

Я хотел бы использовать служебную шину Azure в .Net Core и читать только одно сообщение.Кажется, что Microsoft.Azure.ServiceBus не поддерживает такой случай.До сих пор тестирование кода немного меня задело:

public void ReceiveOne()
{
    var queueClient = new QueueClient(ServiceBusConnectionString, "go_testing");

    queueClient.RegisterMessageHandler(
        async (message, token) =>
        {
            var messageBody = Encoding.UTF8.GetString(message.Body);
            Console.WriteLine($"Received: {messageBody}, time: {DateTime.Now}");
            await queueClient.CompleteAsync(message.SystemProperties.LockToken);

            await queueClient.CloseAsync();
        },
        new MessageHandlerOptions(async args => Console.WriteLine(args.Exception))
        { MaxConcurrentCalls = 1, AutoComplete = false });
}

Так что я закрываю очередь после успешного прочтения одного сообщения.Это работает, но также вызывает исключение.

Знаете ли вы лучший способ добиться этого?

Ответы [ 2 ]

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

Я нашел решение:

IMessageReceiver messageReceiver = new MessageReceiver(ServiceBusConnectionString, QueueName, ReceiveMode.PeekLock);

// Receive the message
Message message = await messageReceiver.ReceiveAsync();

// 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 MessageReceiver is created in ReceiveMode.PeekLock mode (which is default).
await messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
await messageReceiver.CloseAsync();

Вам нужно будет указать:

using Microsoft.Azure.ServiceBus;
using Microsoft.Azure.ServiceBus.Core;

Это исходный источник: https://github.com/Azure/azure-service-bus/tree/master/samples/DotNet/GettingStarted/Microsoft.Azure.ServiceBus/SendReceiveUsingMessageSenderReceiver

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

RegisterMessageHandler - это удобный API для получения всех сообщений, которые появляются в вашей очереди.

Требуется API более низкого уровня queueClient.ReceiveAsync

ReceiveAsync ()

Асинхронно получает сообщение

См. Этот пример Цикл получения для получения нескольких сообщений (если вы хотите)используя API-интерфейс ReceiveAsync.

...