rabbitmq mqtt外掛整合填坑記錄(些許個人拙見,不對還望指出)
mqtt:Message Queuing Telemetry Transport,訊息佇列遙測傳輸
名字很霸氣,適合物聯網感測器窄頻寬網路不穩定的環境,可以持久化,推送離線保活訊息,且可以使用mqttjs在web端使用。
mqtt的服務搭建也很簡單,我用的rabbitmq,一行命令啟用,重啟rabbitmq即可搭建成功。
使用也很簡單,需要注意幾個關鍵點
1,qos(0最多收到一次 1至少收到1次 2保證只收到一次)
2,Retained 可以讓新訂閱的客戶端得到釋出方的最新的狀態值,而不必要等待發送,此操作屬於持久化操作,重啟服務依然可以收到。
3,CleanSession保證離線後再連線是否收到訊息,預設離線訊息是存記憶體,重啟會丟失,除非設定持久化,注意接收離線訊息clientid必須固定
4,ConnectionTimeout超時時間
5,KeepAliveInterval會話心跳時間
坑1,springboot整合
因為springboot整合眾多訊息釋出訂閱的服務,因此只有基本功能,且整合的paho版本過低,mqtt個別高階功能無法使用,spring中有些方法又是針對別的訊息服務才有的而mqtt沒有,因此整合mqtt不建議使用springboot的整合版本,建議使用mqttclient的包或者paho的包自己實現(個人拙見)
坑2,Qos=2報錯,已斷開連線 (32109) - java.io.EOFException
確切的說,這是rabbitmq的坑,官網mqtt介紹首頁即描述了,一直沒注意,另外,據說mqtt3.1也有此問題,升級到3.1.1解決
- QoS0 and QoS1 publish & consume
- QoS2 publish (downgraded to QoS1)
坑3,mqttjs在rabbitmq上整合
需要自己下載原始碼編譯安裝mqtt-web-plugin外掛,試了好幾次都沒編譯過去,看老外的帖子在這幾乎都沒遇到啥問題,日了狗了。。。
參考:https://stackoverflow.com/questions/19813101/java-io-eofexception-with-paho#