Java Eclipse Paho 实施 - 自动重新连接
Java Eclipse Paho Implementation - Auto reconnect
我正在尝试在我的项目中实现 eclipse.paho
以连接 Mqtt Broker(订阅和发布目的)。问题是,当我使用订阅功能(实现 MqttCallback
接口)时,我不知道如果连接丢失我该如何重新连接。 MqttCallback 接口有一个 connectionLost 方法,但它对于调试导致连接丢失的原因很有用。我搜索但找不到建立自动重新连接的方法。你能建议一个关于这个问题的方法或文件吗?
执行此操作的最佳方法是构建连接逻辑,使其独立存在于一个方法中,以便可以从 MqttCallback
实例中的 connectionLost
回调中再次调用它。
向 connectionLost
方法传递了一个 Throwable,它将成为触发断开连接的异常,因此您可以决定根本原因以及这可能如何影响您重新连接。
连接方式应该连接订阅你需要的主题。
像这样:
public class PubSub {
MqttClient client;
String topics[] = ["foo/#", "bar"];
MqttCallback callback = new MqttCallback() {
public void connectionLost(Throwable t) {
this.connect();
}
public void messageArrived(String topic, MqttMessage message) throws Exception {
System.out.println("topic - " + topic + ": " + new String(message.getPayload()));
}
public void deliveryComplete(IMqttDeliveryToken token) {
}
};
public static void main(String args[]) {
PubSub foo = new PubSub();
}
public PubSub(){
this.connect();
}
public void connect(){
client = new MqttClient("mqtt://localhost", "pubsub-1");
client.setCallback(callback);
client.connect();
client.subscribe(topics);
}
}
要使用自动重新连接,只需在 MqttConnectOptions
对象上设置 setAutomaticReconnect(true)
。
MqttAndroidClient mqttClient = new MqttAndroidClient(context, mqttUrl, clientId);
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
mqttConnectOptions.setAutomaticReconnect(true);
mqttClient.connect(mqttConnectOptions, null, mqttActionListener());
我正在使用 paho 客户端 1.2.0。
使用 MqttClient.setAutomaticReconnect(true) 和接口 MqttCallbackExtended API,并且感谢 https://github.com/eclipse/paho.mqtt.java/issues/493,当与代理的连接断开时,我可以设法自动重新连接。
见下方代码。
//Use the MqttCallbackExtended to (re-)subscribe when method connectComplete is invoked
public class MyMqttClient implements MqttCallbackExtended {
private static final Logger logger = LoggerFactory.getLogger(MqttClientTerni.class);
private final int qos = 0;
private String topic = "mytopic";
private MqttClient client;
public MyMqttClient() throws MqttException {
String host = "tcp://localhost:1883";
String clientId = "MQTT-Client";
MqttConnectOptions conOpt = new MqttConnectOptions();
conOpt.setCleanSession(true);
//Pay attention here to automatic reconnect
conOpt.setAutomaticReconnect(true);
this.client = new org.eclipse.paho.client.mqttv3.MqttClient(host, clientId);
this.client.setCallback(this);
this.client.connect(conOpt);
}
/**
* @see MqttCallback#connectionLost(Throwable)
*/
public void connectionLost(Throwable cause) {
logger.error("Connection lost because: " + cause);
/**
* @see MqttCallback#deliveryComplete(IMqttDeliveryToken)
*/
public void deliveryComplete(IMqttDeliveryToken token) {
}
/**
* @see MqttCallback#messageArrived(String, MqttMessage)
*/
public void messageArrived(String topic, MqttMessage message) throws MqttException {
logger.info(String.format("[%s] %s", topic, new String(message.getPayload())));
}
public static void main(String[] args) throws MqttException, URISyntaxException {
MyMqttClient s = new MyMqttClient();
}
@Override
public void connectComplete(boolean arg0, String arg1) {
try {
//Very important to resubcribe to the topic after the connection was (re-)estabslished.
//Otherwise you are reconnected but you don't get any message
this.client.subscribe(this.topic, qos);
} catch (MqttException e) {
e.printStackTrace();
}
}
}
我正在尝试在我的项目中实现 eclipse.paho
以连接 Mqtt Broker(订阅和发布目的)。问题是,当我使用订阅功能(实现 MqttCallback
接口)时,我不知道如果连接丢失我该如何重新连接。 MqttCallback 接口有一个 connectionLost 方法,但它对于调试导致连接丢失的原因很有用。我搜索但找不到建立自动重新连接的方法。你能建议一个关于这个问题的方法或文件吗?
执行此操作的最佳方法是构建连接逻辑,使其独立存在于一个方法中,以便可以从 MqttCallback
实例中的 connectionLost
回调中再次调用它。
向 connectionLost
方法传递了一个 Throwable,它将成为触发断开连接的异常,因此您可以决定根本原因以及这可能如何影响您重新连接。
连接方式应该连接订阅你需要的主题。
像这样:
public class PubSub {
MqttClient client;
String topics[] = ["foo/#", "bar"];
MqttCallback callback = new MqttCallback() {
public void connectionLost(Throwable t) {
this.connect();
}
public void messageArrived(String topic, MqttMessage message) throws Exception {
System.out.println("topic - " + topic + ": " + new String(message.getPayload()));
}
public void deliveryComplete(IMqttDeliveryToken token) {
}
};
public static void main(String args[]) {
PubSub foo = new PubSub();
}
public PubSub(){
this.connect();
}
public void connect(){
client = new MqttClient("mqtt://localhost", "pubsub-1");
client.setCallback(callback);
client.connect();
client.subscribe(topics);
}
}
要使用自动重新连接,只需在 MqttConnectOptions
对象上设置 setAutomaticReconnect(true)
。
MqttAndroidClient mqttClient = new MqttAndroidClient(context, mqttUrl, clientId);
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
mqttConnectOptions.setAutomaticReconnect(true);
mqttClient.connect(mqttConnectOptions, null, mqttActionListener());
我正在使用 paho 客户端 1.2.0。 使用 MqttClient.setAutomaticReconnect(true) 和接口 MqttCallbackExtended API,并且感谢 https://github.com/eclipse/paho.mqtt.java/issues/493,当与代理的连接断开时,我可以设法自动重新连接。
见下方代码。
//Use the MqttCallbackExtended to (re-)subscribe when method connectComplete is invoked
public class MyMqttClient implements MqttCallbackExtended {
private static final Logger logger = LoggerFactory.getLogger(MqttClientTerni.class);
private final int qos = 0;
private String topic = "mytopic";
private MqttClient client;
public MyMqttClient() throws MqttException {
String host = "tcp://localhost:1883";
String clientId = "MQTT-Client";
MqttConnectOptions conOpt = new MqttConnectOptions();
conOpt.setCleanSession(true);
//Pay attention here to automatic reconnect
conOpt.setAutomaticReconnect(true);
this.client = new org.eclipse.paho.client.mqttv3.MqttClient(host, clientId);
this.client.setCallback(this);
this.client.connect(conOpt);
}
/**
* @see MqttCallback#connectionLost(Throwable)
*/
public void connectionLost(Throwable cause) {
logger.error("Connection lost because: " + cause);
/**
* @see MqttCallback#deliveryComplete(IMqttDeliveryToken)
*/
public void deliveryComplete(IMqttDeliveryToken token) {
}
/**
* @see MqttCallback#messageArrived(String, MqttMessage)
*/
public void messageArrived(String topic, MqttMessage message) throws MqttException {
logger.info(String.format("[%s] %s", topic, new String(message.getPayload())));
}
public static void main(String[] args) throws MqttException, URISyntaxException {
MyMqttClient s = new MyMqttClient();
}
@Override
public void connectComplete(boolean arg0, String arg1) {
try {
//Very important to resubcribe to the topic after the connection was (re-)estabslished.
//Otherwise you are reconnected but you don't get any message
this.client.subscribe(this.topic, qos);
} catch (MqttException e) {
e.printStackTrace();
}
}
}