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 并将其添加到在执行程序计划中调用的回调队列中。

所以我期望的是:

  1. OK_EMPTY 当 Edge Hub 收到消息时
  2. MESSAGE_EXPIRED 在 Edge Hub 未能在 2 秒内获得关于主题消费者的确认时的同一回调

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

Message 对象上的程序化 setter 到期时间与边缘枢纽路由的 TTL 有何关系?

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

更新:

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

在发送到边缘集线器的消息上使用 setExpiryTime 方法时,只有当发件人未能将消息传递到边缘集线器时,该过期才有效。

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

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