最近在测试MQTT消息发布时,遇到异常信息
正在进行过多的发布 (32202)
at org.eclipse.paho.client.mqttv3.internal.ClientState.send(ClientState.java:527)
at org.eclipse.paho.client.mqttv3.internal.ClientComms.internalSend(ClientComms.java:163)
at org.eclipse.paho.client.mqttv3.internal.ClientComms.sendNoWait(ClientComms.java:193)
at org.eclipse.paho.client.mqttv3.MqttTopic.publish(MqttTopic.java:128)
at test.MqttSyncTest.main(MqttSyncTest.java:70)
查询资料后了解到,当发布消息Qos不为0时,MqttTopic的publish方法会记录消息并在内部线程池中确认消息已送达。
跟踪publish方法:publish-》comms.sendNoWait-》ClientComms.class:this.internalSend-》ClientState.class:clientState.send->异常位置:if (actualInFlight >= this.maxInflight);继续向下查看代码,可以看到 actualInFlight 消息Qos不为0时处理规则:
switch(innerMessage.getQos()) {
继续查找actualInFlight的变化过程,发现clientState.get()和clientState.decrementInFlight()两个方法:
在publish跟踪过程comms.sendNoWait位置,ClientComms类中发现:CommsSender和ExecutorService
其中CommsSender的run方法,出现message = clientState.get();
该位置调用内容中有:actualInFlight++;语句,对actualInFlight变量进行自增过程。
在ClientState.class的notifyComplete中,调用decrementInFlight方法,对actualInFlight变量进行自减过程。
解决:
1、消息发布时,Qos设置为0。
2、调整客户端连接参数:MaxInflight
MqttConnectOptions conOptions;
this.clientState.setMaxInflight(conOptions.getMaxInflight());
3、改变发送规则,添加消息发送数量控制。