c# - 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 实现是否有问题?
解决方案
在这种情况下,我假设您不想中断循环,直到您的所有消息都发送到受尊重的目的地。我建议您使用 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的更多信息
希望能帮助到你。
推荐阅读
- html - 复选框元素下的额外空间
- visual-studio-code - 将 Visual Studio Code 中的 JavaScript 字符串重构/提取到 HTML 文件中
- scala - 如何火花提交 Play 框架项目
- amazon-redshift - 从 Redshift 获取最近 10 小时的数据
- cdi - “不满足的依赖关系” - 具有相同接口的不同无状态 Bean
- javascript - 图像图标不固定,屏幕尺寸可变
- sapui5 - 如何从 UI5 应用程序调用 CDS 视图生成的 Odata 服务
- regex - 从 URL 字符串中获取令牌
- java - 处理程序未在 Instrumentation Test 中执行 Runnable
- javascript - 获取数据到数据库,如果匹配则重新插入