Java MQTT客户端重新用于发布/订阅
我有一个web服务器,它接收到许多指向同一主题的消息,并将响应消息返回到另一个主题 目前,我通过始终保持MQTT客户机连接,将同一MQTT客户机实例重新用于回调和发送响应消息 但是,在接收消息并发送响应一个周期后,我可以接收另一条消息,但无法发送响应-我必须重新启动应用程序服务器 使用单个MQTTclient实例是一种好方法吗?可以一直保持连接吗?对于这种需求,最好的方法是什么 这是我的密码:Java MQTT客户端重新用于发布/订阅,java,mqtt,Java,Mqtt,我有一个web服务器,它接收到许多指向同一主题的消息,并将响应消息返回到另一个主题 目前,我通过始终保持MQTT客户机连接,将同一MQTT客户机实例重新用于回调和发送响应消息 但是,在接收消息并发送响应一个周期后,我可以接收另一条消息,但无法发送响应-我必须重新启动应用程序服务器 使用单个MQTTclient实例是一种好方法吗?可以一直保持连接吗?对于这种需求,最好的方法是什么 这是我的密码: public static void registerCallBack(String topicNam
public static void registerCallBack(String topicName, String userName,
String password, String clientId, MqttCallback callback,
MqttClient client) {
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);
options.setKeepAliveInterval(30);
options.setUserName(userName);
options.setPassword(password.toCharArray());
// Connect to Broker
try {
options.setSocketFactory(SslUtil.getSocketFactory(
ManagerProps.MQTT_BROKER_CA_FILE.getValue(), ""));
client.setCallback(callback);
client.connect(options);
client.subscribe(topicName, 0);
log.info("successfuly registered callback to topic " + topicName);
} catch (MqttException me) {
log.error("MqttException, " + me);
} catch (Exception e) {
log.error("Exception, " + e);
}
}
public static String publishMessage(MqttClient client, String message,
String topic, String userName, String password) {
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);
options.setKeepAliveInterval(30);
options.setUserName(userName);
options.setPassword(password.toCharArray());
try {
MqttMessage msg = new MqttMessage();
msg.setPayload(message.getBytes());
client.publish(topic, msg);
} catch (MqttException e) {
log.error("MqttException, " + e);
} catch (Exception e) {
log.error("Exception, " + e);
}
return message;
}
我看到了一些类似的东西,并成功地做到了:
final CallbackConnection connection = mqtt.callbackConnection();
connection.listener(new org.fusesource.mqtt.client.Listener() {
public void onConnected() {
}
public void onDisconnected() {
}
public void onFailure(Throwable value) {
value.printStackTrace();
System.exit(-2);
}
public void onPublish(UTF8Buffer topic, Buffer msg, Runnable ack) {
String body = msg.utf8().toString();
if( body.startsWith("REPLY: ")) {
// Don't reply to your own reply
System.out.println("Replied");
System.out.println("");
} else {
try{
byte[] reply = "REPLY: Hello Back".getBytes();
connection.publish(destination, reply, QoS.AT_MOST_ONCE, true, null) ;
msg.clear();
}catch (Exception e){
e.printStackTrace();
}
}
}
});
你可以添加一些关于为什么不能发送的详细信息吗?异常、发布时阻止、其他?拥有一个实例当然很好,而且始终连接它也绝对可以。不过,我无法帮助编写代码。@Anders这就是它的奇怪之处——没有例外或消息。当我dubug它时,我可以清楚地看到publish()正在执行,没有任何异常,但什么也没有发生……也许您需要进入MQTT代码和/或附加网络嗅探器。从代码片段中理解代码流有点困难,但您确实意识到,
publishMessage()
中的MqttConnectOptions
根本没有使用?为什么静态方法?先尝试不使用SSL吗?@Anders我设法从MQTT代理获取了一些日志,看起来消息毕竟正在发送到代理。。。所以我想我的问题是这个消息的客户。顺便说一下,感谢您通知我们未使用的MqttConnectOptions
。静态方法有什么问题?