首页 > 解决方案 > 有两种方法可以从 azure 函数 HTTP 触发器读取所有服务总线消息

问题描述

有两种方法可以read all the messagesservice bus topic.

which one is recommended for azure functions

选项1 -

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

选项 2 -

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.
    }

azure 函数 http 触发器应该使用什么?

标签: azureazure-functionsazure-logic-apps

解决方案


参考 George Chen 的代码,您需要进行一些更改才能阅读主题中的所有消息。

public static class Function1
{
    [FunctionName("Function1")]
    public static async void Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        string serviceBusConnectionString = Environment.GetEnvironmentVariable("servicebuscon");
        var messageReceiver = new MessageReceiver(serviceBusConnectionString, "myqueue", ReceiveMode.PeekLock, null, 500);

        do
        {
        var tempMessages = await messageReceiver.ReceiveAsync(500, TimeSpan.FromSeconds(1));

        foreach (Message m1 in tempMessages)
        {

            log.LogInformation($"C# HTTP trigger function processed message: {Encoding.UTF8.GetString(m1.Body)}");
        }
        }while(tempMessages!=null);
    }
}

上面的代码已经修改了一个 do-while 循环,它接收来自 Topic 的所有消息,而不是队列中的第一条消息。


推荐阅读