.Net Core 中的 Azure 服务总线 - 如何只接收一条消息

Mik*_*Mik 5 queue azure azureservicebus .net-core

我想在 .Net Core 上使用 Azure 服务总线并且只阅读一条消息。似乎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 });
}
Run Code Online (Sandbox Code Playgroud)

所以我在成功阅读一条消息后关闭队列。它有效,但也会触发异常。

你知道更好的方法来实现它吗?

huj*_*omi 9

我找到了一个解决方案:

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();
Run Code Online (Sandbox Code Playgroud)

您需要包括:

using Microsoft.Azure.ServiceBus;
using Microsoft.Azure.ServiceBus.Core;
Run Code Online (Sandbox Code Playgroud)

这是原始来源:https : //github.com/Azure/azure-service-bus/tree/master/samples/DotNet/GettingStarted/Microsoft.Azure.ServiceBus/SendReceiveUsingMessageSenderReceiver

  • 如果您想阅读所有消息,您可以使用 MS 文档中的代码:https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-how-to-使用主题订阅#从订阅接收消息 (2认同)

Dav*_*oft 0

RegisterMessageHandler 是一个方便的 API,用于接收队列中出现的所有消息。

您需要较低级别的 API queueClient.ReceiveAsync

接收异步()

异步接收消息

请参阅此示例接收循环,了解如何使用 ReceiveAsync API 接收多条消息(如果需要)。