【问题标题】:DeviceClient occured timeout but message was send to IotHubDeviceClient 发生超时,但消息已发送到 IotHub
【发布时间】:2019-04-15 03:20:02
【问题描述】:

我对@9​​87654321@ 方法有疑问。

我测试了 LAN 电缆的插入和拔出

_sendDeviceClient.SetRetryPolicy(no);
_sendDeviceClient.OperationTimeoutInMillisecounds = xxx;

不要重试。 等待 xxx 毫秒。

foreach() //Message1 Message2......
{  
  try
  {           
     await _sendDeviceClient.SendEventAsync(message);

     //Message send. Do success process
  }
  catch(Exception e)
  {
     //Message failed. Do failed process 
  }
}

我的日志是“消息发送”,但在 IotHub 消息没有收到消息。 有时,“消息失败”,但 Iothub 收到消息。

我不知道为什么会这样。

无论如何,用 try & catch 来实现会不会有问题?

【问题讨论】:

  • Try Catch 实施起来不是问题……但了解它的工作原理以及在何处使用它至关重要。
  • 您正在循环运行 try/catch - 您是否发送多条消息?如果是这样,您是否设置了一种方法来区分哪些失败,哪些成功?
  • 实际上,除了 try/catch 之外,还有另一种异步方法。所以它可以识别失败或成功

标签: c# azure azure-iot-hub


【解决方案1】:

在这种情况下,我假设您不想中断循环,直到您的所有消息都发送到受尊重的目的地。我建议您使用聚合异常,它可以告诉您整体消息及其状态:

在循环结束时,您可以将 List 传递给它的构造函数并抛出它。

在循环结束时:

AggregateException aggregateEx = new AggregateException(errors);
throw aggregateEx;

在设备上运行的应用程序必须管理连接机制、重新连接机制以及发送和接收消息的重试逻辑。此外,重试策略要求在很大程度上取决于设备的 IoT 场景、上下文、功能。

Azure IoT Hub 设备 SDK 旨在简化从云到设备和设备到云的连接和通信。这些 SDK 提供了一种连接到 Azure IoT Hub 的可靠方式以及用于发送和接收消息的一套全面的选项。

很可能,由于连接失败,消息传递 gest 失败,这可能发生在许多级别。

1) 网络错误:断开连接的套接字和名称解析错误

2) HTTP、AMQP 和 MQTT 传输的协议级错误:分离的链接或过期的会话

3) 本地错误导致的应用程序级错误:无效凭据或服务行为(例如,超出配额或限制)

设备 SDK 可检测所有三个级别的错误。设备 SDK 不会检测和处理与操作系统相关的错误和硬件错误。 SDK 设计基于 Azure 架构中心的 Transient Fault Handling Guidance

我可以看到您选择了不重试策略,这意味着您有带宽或成本问题。

理想情况下,应该实现适当的重试逻辑,以确保交付。在这里您可以查看IOT HUb 的完整示例

您可以阅读更多关于 RetryGuidance here

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 2012-10-26
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多