首页 > 解决方案 > 仅在第一次使用 Azure Function HttpTrigger 从主题中获取消息时使用 MessageReceiver

问题描述

MessageReceiver仅在下一次执行 Function 之后使用 Azure Function 从主题中获取消息的第一次使用,尽管我有消息仍然service bus topic将 null 转换为 variable messages

使用以下代码从 Service Bus Topic 获取消息,原因是什么?

string serviceBusConnectionString = Environment.GetEnvironmentVariable("ConnectionString");
var messageReceiver = new MessageReceiver(serviceBusConnectionString, Environment.GetEnvironmentVariable("topicName/subscriptions/subscriptionName"), ReceiveMode.PeekLock, null, 500);

var messages = await messageReceiver.ReceiveAsync(500, TimeSpan.FromSeconds(1));

我无法理解这一点 - 每 15 分钟,当 LA 呼叫 FA 时,FA 应该能够读取新的可用消息,但它即将变为 null

在此处输入图像描述

有什么与锁定持续时间有关的吗?

标签: c#azureazure-functionsazureservicebus

解决方案


如果我没有理解错,您可以使用计时器触发逻辑应用程序调用该函数以获取服务总线消息,并且您总是会收到旧消息并且您不想要它。

你总是收到旧消息,因为你的 ReceiveMode 是 PeekLock,关于这个 ReceiveMode 你可以检查这个描述:Receive mode。消息后complete,消息不会被删除,这就是为什么您总是收到旧消息的原因。

第一种方法是您可以将其更改为ReceiveAndDelete创建时,MessageReceiver如下面的代码。

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


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

注意:如果您的函数出现异常或其他错误并且消息没有得到完全处理,则此消息将在此模式下删除。

另一种方式是处理完消息后调用CompleteAsync方法,处理完后消息会被删除。

你可以参考下面的代码。

            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)}");
                await messageReceiver.CompleteAsync(m1.SystemProperties.LockToken);

            }

推荐阅读