【问题标题】:Azure queue handling via ReceiveAsync returns null right away通过 ReceiveAsync 处理 Azure 队列立即返回 null
【发布时间】:2018-03-14 18:54:02
【问题描述】:

以下代码的正常预期行为是 ReceiveAsync 会在 Azure 队列中最多查看 1 分钟,然后返回 null 或如果收到则返回一条消息。这样做的预期用途是拥有 IoT 中心资源,其中可以将多条消息添加到旨在用于多个 DeviceClient 对象之一的队列中。每个 DeviceClient 将不断轮询此队列以接收为其发送的消息。因此,其他 DeviceClient 的消息会留在队列中。

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

因此,我不是每分钟看到 1 个日志项,而是说收到了一条空消息,而是每秒收到 2 个日志项(!)。这种行为与几个月前不同,。所以我开始了一些研究 - 到目前为止没有什么结果。

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

这样的问题:

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

任何帮助将不胜感激。

【问题讨论】:

    标签: c# azure


    【解决方案1】:

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

    【讨论】:

    • 我们得到了一个资源组 (2),以及一个与每个资源组相关联的队列。目前没有企业集成类型的服务总线。所以我将从基本订阅开始测试。
    • 您是否介意详细解释一下我们有一个资源组 (2),以及与每个资源组相关联的队列。目前没有企业集成类型的服务总线,
    • 基本上,2 个资源(物联网集线器)组中的每一个都能够包含物联网设备。每个设备都可以发送/接收消息,例如使用如上所示的“ReceiveAsync”。我们为新设备获得了 1 个资源,这些资源在经过验证后被移至“已验证”组。我还没有设置任何服务总线,所以你上面的例子还不能测试 - 因此,我要试试,但它需要先进行一些设置。
    • 服务总线的问题/差异似乎是用于 1-1 通信而不是 1-n。如果一个设备在检索之前锁定总线以进行窥视,那么其他设备将无法锁定总线,直到第一个设备完成对队列的窥视。
    • “topics”,它们只是标准定价层级和更高层级的一部分,似乎能够提供 1-n 通信。 docs.microsoft.com/en-us/azure/service-bus-messaging/… 设备客户端为 iothub 发送/接收的东西应该已经能够做到。但似乎失败了。那么,服务中心主题到底有什么区别(除了成本)?
    猜你喜欢
    • 2018-05-29
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多