Java MQTT客户端在不订阅的情况下终止
我已经设置了MQTT订阅,如下所示:Java MQTT客户端在不订阅的情况下终止,java,mqtt,subscribe,Java,Mqtt,Subscribe,我已经设置了MQTT订阅,如下所示: package com.mqttW.demo; import java.text.SimpleDateFormat; import java.util.*; import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; import org.json.*; public class WSync implem
package com.mqttW.demo;
import java.text.SimpleDateFormat;
import java.util.*;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.json.*;
public class WSync implements MqttCallback {
private String BROKER_URL = "";
private String PROTOCOL = "tcp://";
private String PORT = "1883";
private String TOPIC_ROOT_UNCNF = "/P/uncnf/";
private String TOPIC_ROOT_CNF = "/P/cnf/";
private DbOperations dbo = new DbOperations();
public void setBrokerUrl() {
this.BROKER_URL = PROTOCOL + System.getenv("BROKER_DNS") + ":" + PORT;
}
public String getBrokerUrl() {
return this.BROKER_URL;
}
public void publishPayload(String wName, String txnType, String payload) {
String clientId = wName + "-PUB";
String broker = this.getBrokerUrl();
String topic = TOPIC_ROOT_UNCNF + txnType + "/" + wName;
try {
MqttClient w = new MqttClient(broker, clientId);
w.connect();
MqttMessage message = new MqttMessage(payload.getBytes());
message.setQos(2);
w.publish(topic, message);
w.disconnect();
} catch (MqttException e) {
e.printStackTrace();
}
}
public void processTxns(String wName) {
this.setBrokerUrl();
String broker = this.getBrokerUrl();
String clientId = wName + "-SUB";
String topic = TOPIC_ROOT_CNF + wName + "/CR";
MemoryPersistence persistence = new MemoryPersistence();
try {
MqttConnectOptions c = new MqttConnectOptions();
c.setCleanSession(false);
MqttClient w = new MqttClient(broker, clientId, persistence);
w.connect(c);
w.setCallback(this);
w.subscribe(topic, 2);
System.out.println(w.getServerURI() + " " + w.getClientId() + " " + w.isConnected());
} catch (MqttException e) {
e.printStackTrace();
}
}
@Override
public void connectionLost(Throwable arg0) {
System.out.println("Connection lost at : " + new SimpleDateFormat("yyyy-MM-dd.HH:mm:ss").format(new java.util.Date()));
}
@Override
public void deliveryComplete(IMqttDeliveryToken arg0) {
// TODO Auto-generated method stub
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
String s = new String(message.getPayload());
System.out.println(s);
}
}
使用此方法的类实现了MqttCallback
。System.out.println
正确显示代理URL、客户端ID和连接状态(true
)
所以,我不明白的是,为什么代码会终止?为什么订阅没有设置为侦听消息?终止是什么意思?对该方法的调用不会阻塞,客户端将在后台运行。我们可能需要更多的上下文来解释你在这个问题上所说的话。@hardillb下面链接中的示例等待并显示所有订阅的消息,直到我用
Ctrl-C
终止它。然而,在我展示的示例中,java进程只是退出。是的,但是您还没有为您的示例显示周围的代码,请编辑问题,使其具有使用complete class编辑的complete class。这个类在别处被实例化为private
,然后调用processTxns()
。因此,我使用publicstaticvoidmain(String[]args)
方法重新编写了这个类,将它放在另一个包下运行。没问题!也许,这是一个Java问题,而不是MQTT问题——将占用其他时间。