gpt4 book ai didi

c# - 通过 ReceiveAsync 进行的 Azure 队列处理立即返回 null

转载 作者:行者123 更新时间:2023-12-03 04:20:48 27 4
gpt4 key购买 nike

下面代码的正常预期行为是 ReceiveAsync 查看 Azure 队列长达 1 分钟,然后返回 null 或一条消息(如果收到消息)。其预期用途是拥有一个 IoT 中心资源,其中可以将多条消息添加到用于多个 DeviceClient 对象之一的队列中。每个DeviceClient将不断轮询该队列以接收发送给它的消息。因此,其他设备客户端的消息将保留在其他设备客户端的队列中。

实际行为是 ReceiveAsync 每次调用时都会立即返回 null,没有任何延迟。这与 TimeSpan 指定的值无关 - 或者是否未指定参数(并且使用默认时间)。

因此,我每秒看到 2 个日志项目,而不是每分钟看到 1 个日志项目(表明收到了一条空消息)。这种行为与几个月前不同。所以我开始了一些研究 - 到目前为止收效甚微。

using Microsoft.Azure.Devices;
using Microsoft.Azure.Devices.Client;

public static TimeSpan receiveMessageWaitTime = new TimeSpan(0, 1 , 0);
Microsoft.Azure.Devices.Client.Message receivedMessage = null;

deviceClient = DeviceClient.CreateFromConnectionString(Settings.lastKnownConnectionString, Microsoft.Azure.Devices.Client.TransportType.Amqp);


// This code is within an infinite loop/task/with try/except code
if(deviceClient != null)
{
receivedMessage = await deviceClient.ReceiveAsync(receiveMessageWaitTime);
if(receivedMessage != null)
{
string Json = Encoding.ASCII.GetString(receivedMessage.GetBytes());
// Handle the message
}
else
{
// Log the fact that we got a null message, and try again later
}
await Task.Delay(500); // Give the CPU some time, this is an infinite loop after all.
}

我查看了 Azure 中心,发现队列中有 8 条消息。然后我又添加了 2 个消息,但没有收到任何新消息,队列现在有 10 个项目。

我确实注意到这个问题:Azure ServiceBus: Client.Receive() returns null for messages > 64 KB但我无法查看队列中当前是否确实有那么大的消息(因为 receivemessage 返回 null...)

因此问题:

  • 您可以预览队列中的消息吗?
  • 您能否获得队列大小,例如在获取消息之前询问队列中的消息数量?
  • 您能否在未获取消息的情况下将其从队列中删除?
  • 您可以创建一个基于回调的接收而不是无限循环吗? (我想在内部代码只会看一眼,就像我们已经在做的那样)

任何帮助将不胜感激。

最佳答案

如果您使用 Azure ServiceBus,我建议您可以使用Service Bus Explorer要预览消息,请获取队列中的消息数。而且您也可以在没有收到消息的情况下删除消息。

enter image description here

关于c# - 通过 ReceiveAsync 进行的 Azure 队列处理立即返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49257269/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com