MQTT Paho Qos爲0時,併發publish會出現阻塞的狀況,同時後續發佈一直提示Too many publishes in progress (32202)

如下爲使用的paho jar包:java

<!-- 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>git

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

同時發現快速的重複發佈同一個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方法就一直阻塞。eclipse

同時發送消息時actualInFlight  會自增,發完以後notifySent方法會自減,可是這裏token被remove掉致使不會調用到到這個方法,actualInFlight  只增不減,因此在後面每次發佈都報這個錯誤。測試

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

新的paho依賴:spa

<!-- 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>token

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

 

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

相關文章
相關標籤/搜索