Te sugerimos que pruebes esta resolución en un entorno controlado antes de pasarlo a producción, un saludo.
Solución:
La mejor manera de hacer esto es estructurar su lógica de conexión para que viva en un método propio para que pueda ser llamado nuevamente desde el connectionLost
devolución de llamada en el MqttCallback
ejemplo.
El connectionLost
se pasa un Throwable que será la excepción que desencadenó la desconexión para que pueda tomar decisiones sobre la causa raíz y cómo esto puede afectar cuándo/cómo se vuelve a conectar.
El método de conexión debe conectarse y suscribirse a los temas que necesita.
Algo como esto:
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);
Estoy usando el cliente PAHO 1.2.0. Con MqttClient.setAutomaticReconnect(true) y la interfaz MqttCallbackExtended API, y gracias a https://github.com/eclipse/paho.mqtt.java/issues/493, pude volver a conectarme automáticamente cuando la conexión con el intermediario no funciona.
Vea a continuación el código.
//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();
Para usar la reconexión automática, solo configure setAutomaticReconnect(true)
sobre el MqttConnectOptions
objeto.
MqttAndroidClient mqttClient = new MqttAndroidClient(context, mqttUrl, clientId);
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
mqttConnectOptions.setAutomaticReconnect(true);
mqttClient.connect(mqttConnectOptions, null, mqttActionListener());
Si crees que te ha sido de provecho nuestro artículo, te agradeceríamos que lo compartas con el resto programadores así nos ayudas a difundir este contenido.