0

我正在寻找一种从 MQTT 代理轮询消息的解决方案。我将在这里简要描述解决方案。

我们有一个基于 Spring 的控制器类,它公开 REST API 来处理某些与车辆相关的诊断数据。通过这些 API 之一,Notify3P()我创建了一个 MQTT Java 客户端,并根据一些输入数据将消息发布到给定主题的 MQTT 代理。我的要求是每次客户端在 MQTT 上发布消息时通知第三方系统。

一旦收到通知,3P 系统就会从 MQTT 中提取消息。然后它需要通过getMessage()REST API(我们需要在上面的控制器类上公开)从 MQTT 代理获取消息。getMessage()API 需要轮询 MQTT 中已经发布的消息,并将其交给 3P 系统。postMessage()然后,3P 系统将进行一些处理,并通过在我们的控制器类上公开的另一个 REST API 将响应发送回我们的系统。应该在 MQTTpostMessage()上发布有关该主题的消息。response我需要另一个 REST API checkResponse(),然后轮询responseMQTT 的主题并将响应发送回客户端。

到目前为止我所做的:在应用程序启动时,我有一个启动 bean,它监听 MQTTrequestresponse主题。现在我request使用 REST API 将数据发布到主题Notify3P()。我已经使用获取消息的启动 bean 附加了一个回调。当 3P 需要调用我的控制器来轮询来自 MQTT 的消息时,问题就出现了。

我不清楚如何在 MQTT 上保留消息并按需使用它。在 MQTT 中是否有一种机制可以做到这一点?此外,一旦 3P 系统response再次发布消息,我如何轮询response主题以获取来自 MQTT 的响应并发送给我的控制器的客户端?

我希望问题描述有意义。如果有人有任何解决方案,请发布。任何示例代码都会有很大帮助。

提前致谢!!

4

1 回答 1

0

您可能对 MQTT 的概念有些困惑。关键点之一是没有轮询。

您订阅您的response主题并发布到该request主题。一旦有回复,经纪人就会向您发送回复。你不能隐瞒消息。

听起来您的控制器也需要使用 MQTT。如果它从一开始就订阅了该response主题,那么它将接收消息,您可以随心所欲地使用它们,无需轮询。

为了准确实现您想要的,第三方通知控制器从 MQTT 读取消息,那么控制器无论如何都需要能够使用 MQTT。在这一点上,你不妨“正确”地做到这一点。如果您不想将 MQTT 集成到您的控制器中,那么您将无法按照您的描述进行操作,您将不得不想出另一种在两个组件之间进行通信的方式。

总结 - 如果可以的话,让你的控制器使用 MQTT。

于 2013-11-01T08:42:11.473 回答