代码之家  ›  专栏  ›  技术社区  ›  Mik

Net核心中的Azure服务总线-如何仅接收一条消息

  •  1
  • Mik  · 技术社区  · 8 年前

    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 回复  |  直到 7 年前
        1
  •  9
  •   hujtomi    7 年前

    我找到了一个解决方案:

    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

        2
  •  0
  •   David Browne - Microsoft    8 年前

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

    queueClient.ReceiveAsync

    看到这个样本了吗 Receive Loop 了解如何使用ReceiveAsync API接收多条消息(如果需要)。