gpt4 book ai didi

java - Mqtt Paho 客户端连接始终打开

转载 作者:太空宇宙 更新时间:2023-11-04 12:11:01 32 4
gpt4 key购买 nike

我已经创建了 mqtt 连接suscribeData(),如下所示,以 24/7 从多个设备接收数据

@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() 函数用于保存连接的在线离线状态,我使用 cronjobs 从另一个 url 检查连接。

以下是我的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();
}

从上面的代码中,我的连接处于在线状态,但我停止接收有关订阅主题的数据,因此我尝试了另一种方法,即从数据库中的另一个函数检查连接状态,例如我在连接时将连接设置为在线,并在connectionLost上离线,我可以调用连接(suscribeData()),但几天之内它在tomcat中留下了太多打开的文件,我如何确保以前打开的文件应该关闭

就像 connectionLost() 上的 System.exit(1) 一样,当前进程将关闭,我将在检查状态后重新连接

或者请建议我是否有任何其他逻辑可以用来维持我的连接

最佳答案

您的 catch block 在方法 connectionLost 中不执行任何操作。它应该执行如下操作:

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

您还应该在不需要时断开您的 MQTT 客户端......即处理:

myClient.disconnect();

关于java - Mqtt Paho 客户端连接始终打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39868083/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com