MQTT Paho Qos為0時,並發publish會出現阻塞的情況,同時后續發布一直提示Too many publishes in progress (32202)


以下為使用的paho jar包:

<!-- https://mvnrepository.com/artifact/org.eclipse.paho/org.eclipse.paho.client.mqttv3 -->
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.0</version>
</dependency>

在項目測試的過程中測試同學發現了Too many publishes in progress (32202)的問題,發布消息時對actualInFlight 與 maxInflight兩者進行判斷,若actualInFlight  >= maxInflight就會拋出這個異常,這個值可以設置,但是不能解決根本問題。

同時發現快速的重復發布同一個Qos為0 的topic會出先阻塞的情況,進一步跟蹤發現發布的過程中會調用Token的awitUtilSent的方法,里面調用了this.sentLock.wait()方法等待消息發完,發完之后會調用ClientState的notifySent方法,這里調用了sentLock.notifyAll(),喚醒wait(),發布完成。

Qos為0的消息存儲的token的Key全部為0(后面的token會將前面的覆蓋),在並發較高場景下會出現以下情況,上一條消息發送完后removeToken將后面消息的token 移除了(remove的時候是根據key remove),token被remove掉之后導致后面的消息拿不到token,無法調用notifyAll的方法,另一邊的awit方法就一直阻塞。

同時發送消息時actualInFlight  會自增,發完之后notifySent方法會自減,但是這里token被remove掉導致不會調用到到這個方法,actualInFlight  只增不減,所以在后面每次發布都報這個錯誤。

解決方法:在新版本的jar包中修復了這個問題,將token放在了message中,且Qos為0時不會將token 存到tokenStore中,解決了token丟失的問題

新的paho依賴:

<!-- https://mvnrepository.com/artifact/org.eclipse.paho/org.eclipse.paho.client.mqttv3 -->
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.1</version>
</dependency>

修改的地方:https://github.com/eclipse/paho.mqtt.java/pull/563/commits/cd00fa364a0d0475cb3c748de3ca8bc0ab4b7e10

 

新人不知道咋貼代碼,后續有空貼出代碼更直觀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM