DeviceClient发生超时,但消息已发送到IotHub

时间:2019-04-15 03:20:03

标签: c# azure azure-iot-hub

我对SendEventAsync()方法有疑问。

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

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

请勿重试。 等待中的XXX Millisecounds。

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实现问题吗?

1 个答案:

答案 0 :(得分:0)

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

在循环的最后,您可以将List传递给它的构造函数并将其抛出。

在循环结束时执行:

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

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

Azure IoT中心设备SDK旨在简化从云到设备和设备到云的连接和通信。这些SDK提供了一种可靠的方法来连接到Azure IoT中心,并提供了一组用于发送和接收消息的全面选项。

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

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

2)HTTP,AMQP和MQTT传输的协议级错误:链接断开或会话过期

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

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

我可以看到您没有选择任何重试策略,这意味着您在带宽或成本方面有疑问。

理想情况下,应实施适当的Retry逻辑,以确保交付。在这里,您可以查看IOT HUb

的完整示例

您可以了解有关RetryGuidance here

的更多信息

希望有帮助。