我正在寻找一种从MQTT代理轮询消息的解决方案。我将在这里简要介绍一下解决方案。
我们有一个基于Spring的Controller类,它公开REST API来处理某些与车辆相关的诊断数据。通过其中一个API-Notify3P()
,我创建了一个MQTT java客户端,并根据某些输入数据将消息发布到给定主题的MQTT代理。我的要求是每次客户端在MQTT上发布消息时通知第三方系统。
3P系统将在收到通知后从MQTT接收消息。然后,它需要通过getMessage()
REST API(我们需要在上面的控制器类上公开)从MQTT代理获取消息。 getMessage()
API需要轮询MQTT以查找已发布的消息并将其传递给3P系统。然后,3P系统将执行一些处理,并通过我们的控制器类上公开的另一个REST API postMessage()
将响应发送回我们的系统。 postMessage()
应该在MQTT上的response
主题上发布消息。我需要另一个REST API checkResponse()
,然后轮询MQTT的response
主题并将响应发送回客户端。
到目前为止我做了什么:在应用程序启动时,我有一个启动bean,它可以监听MQTT request
和response
主题。现在,我使用REST API request
将数据发布到Notify3P()
主题。我已经通过启动bean附加了一个回调函数来获取消息。当3P需要调用我的控制器来从MQTT轮询消息时,问题出现了。
我不清楚如何在MQTT上阻止消息并按需消耗它。是否有机制在MQTT中执行此操作?此外,一旦3P系统在response
上发布消息,那么我如何轮询response
主题以从MQTT获取响应并发送给我的Controller的客户端?
我希望问题描述有意义。如果有任何人的解决方案,请发布。任何示例代码都会有很大帮助。
提前致谢!!
答案 0 :(得分:0)
您可能对MQTT的想法有点困惑。其中一个关键点是没有民意调查。
您订阅了response
主题并发布到request
主题。一旦有响应,您将由经纪人发送。你不能阻止消息。
听起来你的控制器也需要谈论MQTT。如果它从一开始就订阅了response
主题,那么它将收到消息,您可以随意使用它们,无需轮询。
为了实现您想要的目标,第三方通知控制器从MQTT读取消息,那么控制器无论如何都需要能够使用MQTT。那时你也可以“正确地”做到这一点。如果您不想将MQTT集成到您的控制器中,那么您就无法完成您所描述的内容,您将不得不想出另外两种组件之间的通信方式。
摘要 - 如果可以的话,让你的控制器与MQTT进行对话。