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

时间:2019-12-08 18:24:03

标签: azure azure-functions azure-logic-apps

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

蔚蓝功能http触发器应使用什么?

2 个答案:

答案 0 :(得分:1)

检查azure binding table,您可能会发现azure函数暂时不支持服务总线输入绑定。

因此,如果要在功能中接收消息,则只能使用服务总线触发器或服务总线sdk。您提供的第一个示例是sdk,第二个示例是触发器。

您说过要在http触发功能中接收消息,因此必须使用Service Bus SDK来实现。您可以参考下面的代码。

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);


            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)}");
            }
        }
    }

答案 1 :(得分:1)

关于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的所有消息,而不是队列中的第一条消息。