Saltar al contenido

Implementación de Java Eclipse Paho: reconexión automática

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *