gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:43:18 29 4
gpt4 key购买 nike

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

最佳答案

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

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

在循环结束时执行:

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

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

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

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

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

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

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

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

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

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

您可以阅读有关 RetryGuidance here 的更多信息

希望有帮助。

关于c# - DeviceClient 发生超时,但消息已发送到 IotHub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55682187/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com