я созданного соединения 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() так, что текущий процесс будет закрыт и я снова верню после проверки состояния
или пожалуйста предложить мне, если есть какая-либо другая логика я могу использовать, чтобы поддерживать свои связи
так 'System.exit (1) 'будет работать для слишком большого количества файлов открытой проблемы ??? – Rawat
Нет .. выход просто прекратит приложение в точке ... Главное, что вам нужно сделать, это разложить клиентов после того, как они сделали свою работу. –
извините, я не знал об этом, на самом деле у меня есть такая реализация, как это предложение 'http: // stackoverflow.com/questions/33735090/java-eclipse-paho-implementation-auto-reconnect', но ii все еще потеряла возможность подключения – Rawat