维护老项目,添加MQTT支持,spring4。没有使用spring集成MQTT。发现MQTT断开重启后无法重新收到订阅消息。暂时没有找到重连之后在订阅之前的额topic的方法,就自己实现一个。
POM
<dependency>
<groupId>org.fusesource.mqtt-client</groupId>
<artifactId>mqtt-client</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.0</version>
</dependency>
客户端,当断开连接时重连。
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashSet;
import java.util.Set;
/**
* mtqq客户端
*
* @author younglamb
*/
public class MyMqttClient {
private static final Logger logger = LoggerFactory.getLogger(MyMqttClient.class);
public static MqttClient mqttClient = null;
private static MemoryPersistence memoryPersistence = null;
private static MqttConnectOptions mqttConnectOptions = null;
private static String clientId = "clientId-1";
private static String mqttuser = "mqttuser";
private static String password = "password ";
private static String Host = "tcp://127.0.0.1:1883";
/**
* 保存topic,断开重连,重新订阅
*/
private static Set<String> topicSet = new HashSet<>();
/**
* 初始化客户端,连接mqtt服务器
*/
public static void init() {
memoryPersistence = new MemoryPersistence();
try {
mqttClient = new MqttClient(Host, clientId, memoryPersistence);
} catch (MqttException e) {
e.printStackTrace();
}
mqttConnectOptions = new MqttConnectOptions();
mqttConnectOptions.setCleanSession(false);
mqttConnectOptions.setConnectionTimeout(30);
mqttConnectOptions.setKeepAliveInterval(45);
mqttConnectOptions.setAutomaticReconnect(true);
//下面两个存在就加上
mqttConnectOptions.setUserName("your_userName");
mqttConnectOptions.setPassword("your_password".toCharArray());
if (!mqttClient.isConnected()) {
try {
mqttClient.connect(mqttConnectOptions);
mqttClient.setCallback(new MqttRecieveCallback());
logger.info("mqtt Connected!");
} catch (MqttException e) {
e.printStackTrace();
}
} else {
logger.info("mqttClient is error");
}
}
/**
* 断开重连,重新订阅之前的额topic,五秒重试一次
*/
public synchronized static void reConnect() {
while (true) {
if (null != mqttClient) {
if (!mqttClient.isConnected()) {
if (null != mqttConnectOptions) {
try {
mqttClient.connect(mqttConnectOptions);
mqttClient.setCallback(new MqttRecieveCallback());
} catch (MqttException e) {
e.printStackTrace();
}
if (mqttClient.isConnected()) {
String[] topicArr = new String[topicSet.size()];
topicSet.toArray(topicArr);
logger.info("主题列表:{}", topicArr);
subTopic(topicArr);
break;
}
} else {
logger.info("mqttConnectOptions is null");
}
} else {
logger.info("mqttClient is null or connect");
}
} else {
init();
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 关闭连接
*/
public static void closeConnect() {
//关闭存储方式
if (null != memoryPersistence) {
try {
memoryPersistence.close();
topicSet.clear();
} catch (MqttPersistenceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
logger.info("memoryPersistence is null");
}
// 关闭连接
if (null != mqttClient) {
if (mqttClient.isConnected()) {
try {
mqttClient.disconnect();
mqttClient.close();
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println("mqttClient is not connect");
}
} else {
System.out.println("mqttClient is null");
}
}
// 订阅主题
public static void subTopic(String[] topicArr) {
for (String topic : topicArr) {
topicSet.add(topic);
}
if (null != mqttClient && mqttClient.isConnected()) {
try {
mqttClient.subscribe(topicArr);
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
logger.info("mqttClient is error");
}
}
/**
* 清空主题
*
* @param topic
*/
public static void cleanTopic(String topic) {
if (null != mqttClient && !mqttClient.isConnected()) {
try {
mqttClient.unsubscribe(topic);
topicSet.remove(topic);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
logger.info("mqttClient is error,Maybe the MQTT connection is down....");
}
}
/**
* 发布消息
* @param pubTopic
* @param message
*/
public static void publishMessage(String pubTopic, String message) {
if (null != mqttClient && mqttClient.isConnected()) {
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setQos(1);
mqttMessage.setPayload(message.getBytes());
MqttTopic topic = mqttClient.getTopic(pubTopic);
if (null != topic) {
try {
MqttDeliveryToken publish = topic.publish(mqttMessage);
if (!publish.isComplete()) {
logger.info("mqtt消息发布成功");
}
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} else {
reConnect();
}
}
public static void main(String[] args) {
init();
subTopic(new String[]{"warning"});
}
当断开时,使用监听,自动在重新连接,五秒重试一次
import org.eclipse.paho.client.mqttv3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
/**
* @author younglamb
*/
public class MqttRecieveCallback implements MqttCallbackExtended {
private static final Logger logger = LoggerFactory.getLogger(MqttRecieveCallback.class);
public final static Map gatewaymessageList = new HashMap();
@Override
public void connectionLost(Throwable cause) {
logger.info("断开连接");
MyMqttClient.reConnect();
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
logger.info("接收主题:{}", topic);
String msg = new String(message.getPayload());
logger.info("接收消息:{}", msg);
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
}
@Override
public void connectComplete(boolean reconnect, String serverURI) {
logger.info("连接成功,连接方式:{}", reconnect ? "重连" : "直连");
}