2016-10-05 2 views
1

я созданного соединения MQTT suscribeData() следующим образом получить данные 24/7 от нескольких устройствMQTT Pāho Клиент подключения всегда открыт

@RequestMapping("/suscribe") 
@ResponseBody 
public String suscribeData(){ 

    connOpt= new MqttConnectOptions(); 
    connOptPublish= new MqttConnectOptions(); 
    boolean result=false; 
    int retry=0; 
    while(!result){ 
     try{ 
      result=initializeMqTTParameters(retry); 
      retry++; 
      if(!result){ 
       Thread.sleep(1000); 
      } 

     }catch(Exception ex){ 

     } 
     if(retry>10){ 
      return "mqtterror"; 
     } 

    } 
     suscribeReceivedData("DATA/#",2); 
     Calendar cal=TimeZoneJu.getCalenderInstance(); 
     ModemOnlineStatus status=new ModemOnlineStatus(); 
     status.setActiondate(cal.getTime()); 
     status.setActiontime(cal.getTime()); 
     status.setModemid("mqttreceive"); 
     status.setRemark("online"); 
     status.setStatus(true); 
     try{ 

      service.checkAndInsertModemStatus(true, status);  
     }catch(Exception ex1){ 

     } 
     return "ok"; 
} 

checkAndInsertModemStatus() функция используется для сохранения онлайн в автономном режиме состояние соединения, я проверяю соединение с другим URL-адресом с помощью cronjobs.

и после моего initializeMqTTParameters

public boolean initializeMqTTParameters(int retry){ 
     String clientID = M2MIO_THING; 
     connOpt = new MqttConnectOptions(); 

     connOpt.setCleanSession(false); 
     connOpt.setUserName(M2MIO_USERNAME); 
     connOpt.setPassword(M2MIO_PASSWORD_MD5.toCharArray()); 
     connOpt.setWill("WILL/mqttreceive", "mqttreceive:disconnected".getBytes(), 2, true); 
     try { 

      if(retry%2==0){ 
       MQTTReceive.myClient = new MqttClient(BROKER_URL, "mqtt_virtual_received_sus_1"); 
      }else{ 
       MQTTReceive.myClient = new MqttClient(BROKER_URL, "mqtt_virtual_received_sus_2"); 
      } 

      MQTTReceive.myClient.setCallback(this); 
      MQTTReceive.myClient.connect(connOpt); 

     } catch (MqttException e) { 
      System.out.println(e.getMessage()); 
      return false; 
     } 
     return true; 
    } 

на connectionLost Я пытаюсь состояние обновления в базе данных и попытаться восстановить

@Override 
    public void connectionLost(Throwable ex) { 
     System.out.println("Mqtt Received Connection Lost"+ex.getMessage()); 
     Calendar cal=TimeZoneJu.getCalenderInstance(); 
     ModemOnlineStatus status=new ModemOnlineStatus(); 
     status.setActiondate(cal.getTime()); 
     status.setActiontime(cal.getTime()); 
     status.setModemid("mqttreceive"); 
     status.setRemark("offline"); 
     status.setStatus(false); 
     try{ 

     service.updateModemStatus(false, status); 
    }catch(Exception ex1){ 

    } 

    suscribeData(); 
} 

и из приведенной выше коды, я получил мои связи были онлайн но я прекратил получать данные по подписным темам, так что другой метод, который я пробовал, я проверяю статус соединения с другой функцией из баз данных e, как я установил соединение онлайн, когда я подключился и отключился в сети, и я могу позвонить для подключения (suscribeData()), но в течение нескольких дней он оставляет мне слишком много открытых файлов в tomcat, как я могу убедиться, что предыдущие открытые файлы должны близко

как System.exit(1) на connectionLost() так, что текущий процесс будет закрыт и я снова верню после проверки состояния

или пожалуйста предложить мне, если есть какая-либо другая логика я могу использовать, чтобы поддерживать свои связи

ответ

0

Ваш блок catch ничего не делает в методе connectionLost .. он должен сделать что-то вроде этого:

catch (Exception e) 
     { 
       e.printStackTrace(); 
       System.exit(1); 
      } 

Вы должны также отключить клиент MQTT всякий раз, когда не required..ie обработку над:

myClient.disconnect(); 
+0

так 'System.exit (1) 'будет работать для слишком большого количества файлов открытой проблемы ??? – Rawat

+0

Нет .. выход просто прекратит приложение в точке ... Главное, что вам нужно сделать, это разложить клиентов после того, как они сделали свою работу. –

+0

извините, я не знал об этом, на самом деле у меня есть такая реализация, как это предложение 'http: // stackoverflow.com/questions/33735090/java-eclipse-paho-implementation-auto-reconnect', но ii все еще потеряла возможность подключения – Rawat

Смежные вопросы