我对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实现问题吗?
答案 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
的更多信息希望有帮助。