MQTT+ActiveMQ實現訊息推送(伺服器端java實現)
阿新 • • 發佈:2019-01-29
上一篇文章已經介紹了mqtt+activemq實現訊息推送移動端的實現,也介紹了利用自帶的web console進行訊息釋出的方法。但是在具體的專案應用中,當我們將需要將該訊息推送模組嵌入到一個後臺管理系統當中,我們就需要在web端來訪問activeMQ來進行訊息的釋出。
同樣用的是org.eclipse.paho.client.mqttv3包,相信看過上一篇文章已經有了一定的瞭解,直接來看程式碼
@Controller
public class HelloController{
private static final String HOST = "tcp://127.0.0.1:1883" ;
private String TOPIC;
private String MESSAGE;
private static final String clientid = "server";
private MqttClient client;
private MqttTopic topic;
private String userName = "admin";
private String passWord = "password";
private MqttMessage message;
@RequestMapping (value="/redirect")
public String doPublish(HttpServletRequest request) throws MqttException {
//獲取前臺傳過來的兩個引數
TOPIC=request.getParameter("topic");
MESSAGE=request.getParameter("message");
//new mqttClient
//MemoryPersistence設定clientid的儲存形式,預設為以記憶體儲存
client = new MqttClient(HOST, clientid, new MemoryPersistence());
//與activeMQ連線的方法
connect();
//new mqttMessage
message = new MqttMessage();
//設定服務質量
message.setQos(2);
//設定是否在伺服器中儲存訊息體
message.setRetained(true);
//設定訊息的內容
message.setPayload(MESSAGE.getBytes());
//釋出
publish(topic, message);
System.out.println("已傳送");
return "result";
}
private void connect() {
// new mqttConnection 用來設定一些連線的屬性
MqttConnectOptions options = new MqttConnectOptions();
// 設定是否清空session,這裡如果設定為false表示伺服器會保留客戶端的連線記錄,這裡設定為true表示每次連線到伺服器都以新的身份連線
// 換而言之,設定為false時可以客戶端可以接受離線訊息
options.setCleanSession(false);
// 設定連線的使用者名稱和密碼
options.setUserName(userName);
options.setPassword(passWord.toCharArray());
// 設定超時時間
options.setConnectionTimeout(10);
// 設定會話心跳時間
options.setKeepAliveInterval(20);
try {
// 設定回撥類
client.setCallback(new PushCallback());
// 連線
client.connect(options);
// 獲取activeMQ上名為TOPIC的topic
topic = client.getTopic(TOPIC);
} catch (Exception e) {
e.printStackTrace();
}
}
public void publish(MqttTopic topic, MqttMessage message) throws MqttPersistenceException, MqttException {
// 釋出的方法
// new mqttDeliveryToken
MqttDeliveryToken token = topic.publish(message);
// 釋出
token.waitForCompletion();
System.out.println("message is published completely! "
+ token.isComplete());
}
}
簡陋的效果圖