首页 > 解决方案 > DeviceClient 发生超时,但消息已发送到 IotHub

问题描述

我对方法有疑问SendEventAsync()

我测试了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 实现是否有问题?

标签: c#azureazure-iot-hub

解决方案


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

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

在循环结束时执行:

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

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

Azure IoT Hub 设备 SDK 旨在简化从云到设备和设备到云的连接和通信。这些 SDK 提供了一种连接到 Azure IoT 中心的强大方法以及用于发送和接收消息的一组综合选项。

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

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

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

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

设备 SDK 可检测所有三个级别的错误。设备 SDK 不会检测和处理与操作系统相关的错误和硬件错误。SDK 设计基于 Azure 架构中心的瞬态故障处理指南

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

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

您可以在此处阅读有关 RetryGuidance的更多信息

希望能帮助到你。


推荐阅读