Azure Edge Hub 消息过期未触发回调
Azure edge hub message expiry not triggering callback
我有一个场景,如果模块没有响应超过几秒钟,我需要显示一条消息。
为此,我调用 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(476) - Received status callback for connection status: OK_EMPTY
当我挖掘 Java 模块逻辑的源代码时,它似乎应该每 10 毫秒轮询一次发送和接收消息。然后它调用随该消息提供的任何回调。当 System.currentTimeMillis()
大于提供的到期时间时,消息被视为已过期。这应该将数据包状态设置为 MESSAGE_EXPIRED
并将其添加到在执行程序计划中调用的回调队列中。
所以我期望的是:
OK_EMPTY
当 Edge Hub 收到消息时
MESSAGE_EXPIRED
在 Edge Hub 未能在 2 秒内获得关于主题消费者的确认时的同一回调
我是不是误解了这些回调的工作原理?
Message
对象上的程序化 setter 到期时间与边缘枢纽路由的 TTL 有何关系?
我在哪里可以收听 MESSAGE_EXPIRED
事件来实现我想要的行为?
更新:
我尝试将过期时间调低为 0,这会立即触发 MESSAGE_EXPIRED
,即使我发送到的模块在线。我尝试以 100 毫秒为增量将时间从 500 毫秒减少到 100 毫秒,但没有帮助;我仍然没有收到 MESSAGE_EXPIRED
消息。
在发送到边缘集线器的消息上使用 setExpiryTime
方法时,只有当发件人未能将消息传递到边缘集线器时,该过期才有效。
一旦消息被传送到边缘集线器,SDK 的工作就完成了,这是一个“即发即弃”的过程。
进入边缘枢纽后,您可以在路线部分使用 timeToLiveSecs
。然而,这也不会导致任何回调,它只是告诉边缘集线器丢弃未能在时限内传递的消息。
我有一个场景,如果模块没有响应超过几秒钟,我需要显示一条消息。
为此,我调用 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(476) - Received status callback for connection status: OK_EMPTY
当我挖掘 Java 模块逻辑的源代码时,它似乎应该每 10 毫秒轮询一次发送和接收消息。然后它调用随该消息提供的任何回调。当 System.currentTimeMillis()
大于提供的到期时间时,消息被视为已过期。这应该将数据包状态设置为 MESSAGE_EXPIRED
并将其添加到在执行程序计划中调用的回调队列中。
所以我期望的是:
OK_EMPTY
当 Edge Hub 收到消息时MESSAGE_EXPIRED
在 Edge Hub 未能在 2 秒内获得关于主题消费者的确认时的同一回调
我是不是误解了这些回调的工作原理?
Message
对象上的程序化 setter 到期时间与边缘枢纽路由的 TTL 有何关系?
我在哪里可以收听 MESSAGE_EXPIRED
事件来实现我想要的行为?
更新:
我尝试将过期时间调低为 0,这会立即触发 MESSAGE_EXPIRED
,即使我发送到的模块在线。我尝试以 100 毫秒为增量将时间从 500 毫秒减少到 100 毫秒,但没有帮助;我仍然没有收到 MESSAGE_EXPIRED
消息。
在发送到边缘集线器的消息上使用 setExpiryTime
方法时,只有当发件人未能将消息传递到边缘集线器时,该过期才有效。
一旦消息被传送到边缘集线器,SDK 的工作就完成了,这是一个“即发即弃”的过程。
进入边缘枢纽后,您可以在路线部分使用 timeToLiveSecs
。然而,这也不会导致任何回调,它只是告诉边缘集线器丢弃未能在时限内传递的消息。