2013-11-01 23 views
0

我正在尋找一個解決方案來輪詢來自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 requestresponse主題。現在我使用REST API Notify3P()發佈數據到request主題。我附加了一個回調函數,獲取消息的啓動bean。當3P需要調用我的控制器來輪詢來自MQTT的消息時,問題就來了。

我不清楚如何阻止MQTT上的消息並按需使用它。 MQTT中是否有一種機制可以實現它?另外,一旦3P系統在response上發佈消息,那麼我又如何輪詢response主題以從MQTT中獲取響應併發送給我的控制器的客戶端?

我希望問題描述有意義。如果有任何人的解決方案,請發佈。任何示例代碼都會有很大的幫助。

在此先感謝!

回答

0

您可能已經認識到MQTT有點困惑。其中一個關鍵點是沒有投票。

您訂閱您的response主題併發布到request主題。一旦有迴應,您將由經紀人發送。你不能阻止消息。

聽起來你的控制器也需要談論MQTT。如果從一開始就訂閱response主題,那麼它將收到消息,您可以使用它們做什麼,不需要輪詢。

爲了實現你想要的,第三方通知控制器從MQTT讀取消息,那麼控制器無論如何都需要能夠使用MQTT。那時你可能會「適當地」這樣做。如果您不想將MQTT集成到您的控制器中,那麼您無法執行您所描述的內容,而必須在這兩個組件之間建立另一種通信方式。

總結 - 如果可以,請讓您的控制器說說MQTT。

+0

嗨@Ralight,感謝您的post.My控制器只有一些REST API-s暴露給它的調用者。我有一個啓動spring bean,訂閱經紀商的「請求」主題。然後通過我的控制器API客戶端將他們的數據發佈到「請求」主題。此時,我的啓動bean的回調被觸發,並在任何消息到達時通知3P.Now 3P需要通過Controller上暴露的API來獲取消息。這是因爲3P系統可能不想立即處理味精。我想只有解決方法是將消息放在像數據結構這樣的全球地圖上。 – chakrar

+0

是的,這些消息需要存儲在某個地方做你想做的事情。 – ralight

+0

請糾正我,如果我錯了。假設我想從客戶端向MQTT發佈消息。我希望稍後從MQTT經紀人中逐一獲取發佈的消息。 MQTT無法實現這種特定場景。我需要將消息存儲在某處並從那裏檢索。我對麼?如果我的理解是正確的,那麼我的問題是爲什麼需要維護一個單獨的消息存儲的開銷?爲什麼我們不能使用mqtt broker隊列來達到這個目的? – chakrar