我正在尋找一個解決方案來輪詢來自MQTT代理的消息。我將在這裏簡要描述解決方案。需要從Java REST API中調查Mqtt代理以查看已發佈的消息到MQTT
我們有一個基於Spring的Controller類,公開了REST API來處理某些車輛相關的診斷數據。通過其中一個API-s 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 Notify3P()
發佈數據到request
主題。我附加了一個回調函數,獲取消息的啓動bean。當3P需要調用我的控制器來輪詢來自MQTT的消息時,問題就來了。
我不清楚如何阻止MQTT上的消息並按需使用它。 MQTT中是否有一種機制可以實現它?另外,一旦3P系統在response
上發佈消息,那麼我又如何輪詢response
主題以從MQTT中獲取響應併發送給我的控制器的客戶端?
我希望問題描述有意義。如果有任何人的解決方案,請發佈。任何示例代碼都會有很大的幫助。
在此先感謝!
嗨@Ralight,感謝您的post.My控制器只有一些REST API-s暴露給它的調用者。我有一個啓動spring bean,訂閱經紀商的「請求」主題。然後通過我的控制器API客戶端將他們的數據發佈到「請求」主題。此時,我的啓動bean的回調被觸發,並在任何消息到達時通知3P.Now 3P需要通過Controller上暴露的API來獲取消息。這是因爲3P系統可能不想立即處理味精。我想只有解決方法是將消息放在像數據結構這樣的全球地圖上。 – chakrar
是的,這些消息需要存儲在某個地方做你想做的事情。 – ralight
請糾正我,如果我錯了。假設我想從客戶端向MQTT發佈消息。我希望稍後從MQTT經紀人中逐一獲取發佈的消息。 MQTT無法實現這種特定場景。我需要將消息存儲在某處並從那裏檢索。我對麼?如果我的理解是正確的,那麼我的問題是爲什麼需要維護一個單獨的消息存儲的開銷?爲什麼我們不能使用mqtt broker隊列來達到這個目的? – chakrar