private static Logger logger = LoggerFactory.getLogger(MqttMessageServer.class);private static MqttClient mqttClient = null;private static int allQos = 2;private MemoryPersistence persistence = newMemoryPersistence();private final BlockingQueue messageQueue = new LinkedBlockingQueue();
@ResourceprivateMqttConfiguration mqttConfiguration;
@ResourceprivateMqttMessageProcessService mqttMessageProcessService;
@Overridepublic void run(ApplicationArguments args) throwsException {
String clientUrl=mqttConfiguration.getClientUrl();
String clientTopic=mqttConfiguration.getClientTopic();
String clientId=mqttConfiguration.getClientId();//初始化参数
MqttConnectOptions connOpts = newMqttConnectOptions();
connOpts.setCleanSession(true);
connOpts.setConnectionTimeout(30);
connOpts.setKeepAliveInterval(60);
connOpts.setAutomaticReconnect(true);try{
mqttClient= newMqttClient(clientUrl, clientId, persistence);
mqttClient.setCallback(newMqttCallbackExtended() {
@Overridepublic void connectComplete(booleanarg0, String arg1) {//订阅主题
subscribeInformation(mqttClient,clientTopic, allQos);
logger.info(">>>>>>>>订阅所有主题成功>>>>>>>>");
}
@Overridepublic voidconnectionLost(Throwable throwable) {
logger.info(">>>>>>>>MQTT服务器失去连接!!!>>>>>>>>");
}
@Overridepublic void messageArrived(String topic, MqttMessage mqttMessage) throwsException {
System.err.println("========================");
logger.info(">>>>>>>>接收到MQTT推送的消息:" +topic);
logger.info(">>>>>>>>接收到MQTT推送的消息内容:" + new String(mqttMessage.getPayload(), 0, mqttMessage.getPayload().length,"UTF-8"));
PostedMsg postedMsg= newPostedMsg(mqttMessage,topic);
messageQueue.offer(postedMsg);
}
@Overridepublic voiddeliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
logger.info("deliveryComplete:" +iMqttDeliveryToken.getMessageId());
}
});
mqttClient.connect(connOpts);
logger.info(">>>>>>>>连接MQTT服务器成功!!!,连接信息:"+clientUrl);
Executors.newSingleThreadExecutor().execute(newRunnable() {
@Overridepublic voidrun() {while (true) {try{
PostedMsg msg=(PostedMsg) messageQueue.take();if (msg != null) {
MqttMessage mqttMessage=(MqttMessage) msg.getMsg();
String strRevMsg= null;try{
strRevMsg= new String(mqttMessage.getPayload(), 0, mqttMessage.getPayload().length,"UTF-8");
}catch(UnsupportedEncodingException e) {
e.printStackTrace();
}
mqttMessageProcessService.processMqttMsg(msg.getTopic(), strRevMsg);
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
});//缓存MqttClient实例在Map中
GlobalHashMap.mqttClientMap.put("mqttClient", mqttClient);
}catch(MqttException e) {
e.printStackTrace();
}
}private void subscribeInformation(MqttClient mqttClient,String allTopics,intallQos) {try{
mqttClient.subscribe(allTopics, allQos);
}catch(MqttException e) {
e.printStackTrace();
}
}/*** PUSH消息MQTT*/
public void sendMqttMessage(String content, intqos, String topic) {try{
MqttMessage message= new MqttMessage(content.getBytes("UTF-8"));
message.setQos(qos);
message.setRetained(false);
mqttClient.publish(topic, message);
}catch(Exception e) {
e.printStackTrace();
}
}