Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅在首次使用Azure函数HttpTrigger从主题获取消息时使用MessageReceiver_C#_Azure_Azure Functions_Azureservicebus - Fatal编程技术网

C# 仅在首次使用Azure函数HttpTrigger从主题获取消息时使用MessageReceiver

C# 仅在首次使用Azure函数HttpTrigger从主题获取消息时使用MessageReceiver,c#,azure,azure-functions,azureservicebus,C#,Azure,Azure Functions,Azureservicebus,使用MessageReceiver仅在第一次使用Azure函数从主题获取消息之后,下次执行函数时,尽管我在服务总线主题中有消息在变量消息中仍然获取空值 使用以下代码从服务总线主题获取消息,原因是什么 string serviceBusConnectionString = Environment.GetEnvironmentVariable("ConnectionString"); var messageReceiver = new MessageReceiver(serviceBusConnec

使用
MessageReceiver
仅在第一次使用Azure函数从主题获取消息之后,下次执行函数时,尽管我在
服务总线主题中有消息
在变量
消息
中仍然获取空值

使用以下代码从服务总线主题获取消息,原因是什么

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分钟一次 FA应该能够读取新的可用消息,但即将为空


是否与锁定持续时间有关

var messages = await messageReceiver.ReceiveAsync(500, TimeSpan.FromSeconds(1));
将等待,直到收到一条或多条消息,然后返回。以后传入的任何消息都不会被读取。如果您想这样做(我想怀疑这在Azure函数中是否是一个好主意),请将其放入循环:

while(/* some condition */)
{
     messages = await messageReceiver.ReceiveAsync(500, TimeSpan.FromSeconds(1));
     // do something with the received messages
}
将等待,直到收到一条或多条消息,然后返回。以后传入的任何消息都不会被读取。如果您想这样做(我想怀疑这在Azure函数中是否是一个好主意),请将其放入循环:

while(/* some condition */)
{
     messages = await messageReceiver.ReceiveAsync(500, TimeSpan.FromSeconds(1));
     // do something with the received messages
}

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

您总是收到旧消息,因为您的ReceiveMode是PeekLock,关于此ReceiveMode,您可以查看以下描述:。在
完成
消息后,消息不会被删除,这就是为什么您总是收到旧消息的原因

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

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


            var tempMessages = await messageReceiver.ReceiveAsync(500, TimeSpan.FromSeconds(1));
            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);

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

另一种方式是在处理完消息后调用该方法,处理完消息后将被删除

您可以参考下面的代码

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


            var tempMessages = await messageReceiver.ReceiveAsync(500, TimeSpan.FromSeconds(1));
            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);

            }

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

您总是收到旧消息,因为您的ReceiveMode是PeekLock,关于此ReceiveMode,您可以查看以下描述:。在
完成
消息后,消息不会被删除,这就是为什么您总是收到旧消息的原因

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

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


            var tempMessages = await messageReceiver.ReceiveAsync(500, TimeSpan.FromSeconds(1));
            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);

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

另一种方式是在处理完消息后调用该方法,处理完消息后将被删除

您可以参考下面的代码

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


            var tempMessages = await messageReceiver.ReceiveAsync(500, TimeSpan.FromSeconds(1));
            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);

            }

启用批处理操作应为false

但这也适用于随机时间:(这不是一个很好的证明问题的解决方案

查看下面的屏幕截图-
启用批处理操作应为false

但这也适用于随机时间:(这不是一个很好的证明问题的解决方案

查看下面的屏幕截图-

当您已经使用Azure函数时,为什么不使用Service Bus触发器?这正是它们的用途。因为我的用例不同,所以我从Logic app调用此http触发器FA。您是否尝试过函数之外的函数代码?此外,我会验证设置是否指向正确的环境。是的,设置是同样正确..不确定为什么会出现这种行为为什么在您已经使用Azure函数时不使用Service Bus触发器?这正是它们的用途。因为我的用例不同,所以我从Logic app调用此http触发器FA。您是否尝试过函数外的函数代码?另外,我会验证设置是否指向g到正确的环境。是的,设置也正确..不确定这种行为的原因此基于http触发器的azure函数将在每15分钟后从logic app调用一次,因此如果15分钟后我们有任何新消息,我将阅读这些消息并在处理后完成。如何处理这种情况?我真的不知道,什么你实际上是在尝试实现。如果你真的想每15分钟只准备一次新消息,你还可以有一个计时器触发的Azure功能。我不明白这一点-每15分钟LA给FA打电话,FA就应该能够阅读新的可用消息?是的,这在技术上是可行的。我只是怀疑这是否是一个很好的idea.那你为什么不使用一个服务总线触发的逻辑应用程序呢?这个基于http触发的azure函数每15分钟就会从逻辑应用程序中调用一次,所以如果我们在15分钟后有任何新消息,我会阅读这些消息,并在处理后完成。如何解决这种情况?我真的不知道,你实际上在尝试什么o实现。如果你真的只想每隔15分钟准备一次新消息,你还可以有一个计时器触发的Azure功能。我不明白这一点-当LA呼叫FA时,每隔15分钟FA应该能够读取新的可用消息?是的,这在技术上是可行的。我只是质疑这是否是一个好主意。你为什么不干脆使用服务总线触发逻辑应用程序?正是我使用的第二种给定方法:)我的问题是我没有得到旧消息我在消息中得到null,尽管我在主题中有消息:(如果您完成该消息,它将被删除。是的,它将被删除,但下次我有新消息进入该主题时,我应该获得这些新消息,因为我的FA每15分钟运行一次相同的代码。您应该在FA每次运行时都获得可用的新消息,对吗?是否有任何与锁定持续时间相关的内容?我确实使用了2n。)d给定的方法:)我的问题是我没有得到旧消息,我得到的是空消息