emqx官方示例的java开发中,如何实现客户端断线重连?

回调消息处理类 OnMessageCallback.java

java

package io.emqx;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;

public class OnMessageCallback implements MqttCallback {
    public void connectionLost(Throwable cause) {
        // 连接丢失后,一般在这里面进行重连
        System.out.println("连接断开,可以做重连");
    }

    public void messageArrived(String topic, MqttMessage message) throws Exception {
        // subscribe后得到的消息会执行到这里面
        System.out.println("接收消息主题:" + topic);
        System.out.println("接收消息Qos:" + message.getQos());
        System.out.println("接收消息内容:" + new String(message.getPayload()));
    }

    public void deliveryComplete(IMqttDeliveryToken token) {
        System.out.println("deliveryComplete---------" + token.isComplete());
    }
}

注释写可以做重连,但纯小白不知道怎么做,网上资料是在connectionLost函数里直接client.reconnect(),但在callback里并没有定义client对象。

两种方案

  1. 开启 SDK 的自动重连(推荐)
    MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
    mqttConnectOptions.setAutomaticReconnect(true);

  2. 在 connectionLost 里面实现自己的重连逻辑,例如把 client 提成为 Class 的成员变量?

感谢回答,请问自动重连是不是需要重新订阅主题呢

不需要的,一般 SDK 会负责这些事情。可以检查下