那些年用EMQ踩过的坑

前提

语言用的是Java,包是org.eclipse.paho.client.mqttv3这个,MQ是EMQ。

坑一

客户端ID相同,导致互相挤下线

场景

公司有很多场景用到MQTT,比如移动端、Java后台、前端JS、流水线C#程序、各类物联网硬件Python脚本等等

很多同事使用的时候,如果进行连接的clientID有冲突的话,会导致已经连接的客户端断开连接,而这个时候如果客户端的回调里面做了断线重连处理的话,就会变成2个客户端一直在断线重连...断线重连...断线重连...

解决方案:

既然问题是客户端ID相同,那就让客户端ID不相同即可。

比如给客户端ID加UUID后缀,或者加时间戳后缀之类的,只要能确保不重复即可。

//客户端
MqttClient testClient = new MqttClient("主题名称","testClient_"+UUID.randomUUID().toString());
//配置
MqttConnectOptions options = new MqttConnectOptions();
options = new MqttConnectOptions();
options.setCleanSession(true);//设置清除会话信息  
options.setUserName("用户名");//设置用户名
options.setPassword("密码".toCharArray());//设置密码
testClient.setCallback(new TestCallback());//回调
testClient.connect(options);//连接

坑二

回调类报错引发的客户端断线

场景

当我们的客户端订阅了某个主题,该主题收到消息后,就会进到messageArrived方法。

public void messageArrived(String topic, MqttMessage message) throws Exception {
    // subscribe后得到的消息会执行到这里面
    // 时间格式转换
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println("接收消息时间 : " + sdf.format(new Date()));
    System.out.println("接收消息主题 : " + topic);
    System.out.println("接收消息Qos : " + message.getQos());
    System.out.println("接收消息内容 : " + new String(message.getPayload()));
        
}

一般我们发送和接收到的消息都是JSON格式的字符串,然后会在这个方法里面做业务逻辑处理。

当我们收到的消息内容不符合预期的格式时,而我们又未做相应的处理时,就会报错抛出异常,从而导致接收到该消息的客户端断线。

如果只是普通的代码逻辑问题,只需要打个断点看看具体问题具体分析,然后处理即可。

如果是因为发送消息方使用了Retained,导致的一订阅收到消息即报错,触发重连后重新订阅又报错的死循环的话。

有可能是在18083控制台发送的测试数据,默认被勾选了Retained

也可能是代码里面发送消息设置了Retained

//第四个参数retained
testClient.publish(topic, payload, qos, retained);

解决方案:

用任一客户端往有问题的主题发送一条空消息,并设置Retained为true,即可清除该主题所保留的最后一条设置了Retained的异常消息。

testClient.publish("有问题的主题", "".getBytes(), 0, true);

坑三

发送的消息内容太长,导致客户端断线

场景

客户端往某个主题发送消息,消息内容太长导致一执行发送操作,客户端就掉线。

原因是EMQ默认的消息长度是64K(65536字节),一旦超过就会出问题。

解决方案:

根据版本的不同,找到对应的配置文件,修改对应的配置即可,最高为256MB

如1.x版本的EMQ则在安装目录的/emqttd/etc/emqttd.config修改其中的

如2.x版本的EMQ则在安装目录的/emqttd/etc/emqttd.conf修改其中的

也可能在安装目录的/emqttd/etc/emq.conf修改其中的

然后重启EMQ即可。

坑四

未完。。。待编辑。。。

注:仅供自己学习,记录问题和参考,若有带来误解和不便请见谅,共勉!

猜你喜欢

转载自blog.csdn.net/u011267225/article/details/81982515