微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Azure 边缘集线器消息到期未触发回调

如何解决Azure 边缘集线器消息到期未触发回调

我有一个场景,如果模块没有响应超过几秒钟,我需要显示一条消息。

为此,我调用 sendEventAsync,在其中构造一条到期时间为 2000 毫秒的消息:

module.sendMessagetoTopic(ConnectionStatusRequest.newBuilder().withExpiryTime(2000).build(),(responseStatus,callbackContext) -> {
    if (IotHubStatusCode.MESSAGE_EXPIRED.equals(responseStatus)) {
        LOGGER.warn("Could not retrieve connection status before TTL,considering module as offline.");
        broadcastConnectionStatus(IotHubConnectionStatus.disCONNECTED);
    } else {
        LOGGER.info("Received status callback for connection status: {}",responseStatus);
    }
});

边缘部署架构对除上游以外的所有路由的 TTL 为 90 秒,我希望此特定消息存在 2 秒。如果我在 2 秒内未收到有关此主题回复,则认为消息已过期,相关模块被视为脱机。我还尝试将路由特定的 TTL 设置为 2 秒,但没有在消息上设置到期时间,但我得到了相同的结果。

但是,当我尝试通过手动终止侦听此主题的容器来强制解决此问题时,它需要 > 2 秒才能再次启动,我从未收到状态为 MESSAGE_EXPIRED 的回调:>

2021-07-19 09:25:42,683 [WebSocketWorker-17] INFO  s.i.l.w.service.WebSocketService.broadcastConnectionStatus(470) - Module is online,requesting additional status information from other modules.
2021-07-19 09:25:42,740 [azure-iot-sdk-IotHubSendTask] INFO  s.i.l.w.service.WebSocketService.lambda$broadcastConnectionStatus$32(476) - Received status callback for connection status: OK_EMPTY

当我深入挖掘 Java 模块逻辑的源代码时,它似乎应该每 10 毫秒轮询一次发送和接收消息。然后它调用随该消息提供的任何回调。当 System.currentTimeMillis() 大于提供的过期时间时,消息被视为过期。这应该将数据包状态设置为 MESSAGE_EXPIRED 并将其添加到按执行程序调度调用的回调队列中。

所以我期望的是:

  1. OK_EMPTY 当 Edge Hub 收到消息时
  2. MESSAGE_EXPIRED 在 Edge Hub 未能在 2 秒内获得主题使用者的 ack 时的同一个回调

我是否误解了这些回调的工作原理?

Message 对象上的到期时间的编程设置器与边缘集线器路由的 TTL 有何关联?

在哪里可以监听 MESSAGE_EXPIRED 事件以实现我想要的行为?

更新:

我尝试将到期时间降低到 0,即使我发送到的模块在线,它也会立即触发 MESSAGE_EXPIRED。我试过以 100 毫秒的增量将时间从 500 毫秒减少到 100 毫秒,但没有帮助;我仍然没有收到 MESSAGE_EXPIRED 消息。

解决方法

对发送到边缘集线器的消息使用 setExpiryTime 方法时,只有当发送者无法将消息传递到边缘集线器时,该过期时间才有效。

一旦消息传递到边缘集线器,SDK 工作就完成了,这是一个“即发即忘”的过程。

进入边缘集线器后,您可以在路由部分使用 timeToLiveSecs。然而,这也不会引起任何回调,它只是告诉边缘集线器丢弃在时间限制内未能传递的消息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。