1.場景還原
筆者在上篇已經介紹過mqtt相關介紹,教程鏈接:https://blog.csdn.net/zhangxing52077/article/details/80568244,今天筆者就實際項目中的前後端實時交互作個分享
2.設計思路
首先,後端在工程中配置需要訂閱的通配topic,主要是爲了能夠接收前端傳過來的請求;然後前端在初始化的時候也需要訂閱具體的相關主題,爲了能夠接收後端傳來的請求,這裏後端需要提供一個訂閱主題的接口供前端調用
3.實現方案
① yml配置類配置
@ConfigurationProperties(prefix = "com.mqtt")
public class MqttProperties {
private MqttInboundProperties inbound;
private MqttOutboundProperties outbound;
public MqttInboundProperties getInbound() {
return inbound;
}
public void setInbound(MqttInboundProperties inbound) {
this.inbound = inbound;
}
public MqttOutboundProperties getOutbound() {
return outbound;
}
public void setOutbound(MqttOutboundProperties outbound) {
this.outbound = outbound;
}
}
關於mqtt數據消費端配置類
public class MqttInboundProperties {
private String url;
private String username;
private String password;
private String clientId;
private String topics;
//getter,setter方法
}
關於mqtt數據生產端配置類
public class MqttOutboundProperties {
private String urls;
private String username;
private String password;
private String clientId;
private String topic;
//getter,setter方法
}
配置類生效配置
@Configuration
@EnableConfigurationProperties(MqttProperties.class)
public class MqttPropertiesConfiguration {
}
② 生產端
/**
* @auther zx
* @date 2018/9/20 20:03
* 生產端
*/
@Configuration
public class MqttOutboundConfiguration {
@Autowired
private MqttProperties mqttProperties;
@Bean
public MqttPahoClientFactory mqttClientFactory() {
String[] serverURIs = mqttProperties.getOutbound().getHost().split(",");
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setServerURIs(serverURIs);
factory.setCleanSession(false);
factory.setUserName(mqttProperties.getOutbound().getUsername());
factory.setPassword(mqttProperties.getOutbound().getPassword());
return factory;
}
@Bean
@ServiceActivator(inputChannel = "mqttOutboundChannel")
public MessageHandler mqttOutbound() {
MqttPahoMessageHandler messageHandler =
new MqttPahoMessageHandler(mqttProperties.getOutbound().getClientId(), mqttClientFactory());
messageHandler.setAsync(true);
messageHandler.setDefaultTopic(mqttProperties.getOutbound().getTopic());
return messageHandler;
}
@Bean
public MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
}
③ 消費端(後端接收前端的傳值並解析)
/**
* @auther zx
* @date 2018/9/20 20:06
* 消費端
*/
@Configuration
@Slf4j
public class MqttInboundConfiguration {
@Autowired
private MqttProperties mqttProperties;
@Bean
public MessageChannel mqttInputChannel() {
return new DirectChannel();
}
@Bean
public MessageProducer inbound() {
MqttPahoMessageDrivenChannelAdapter adapter =
new MqttPahoMessageDrivenChannelAdapter(mqttProperties.getInbound().getHost(), mqttProperties.getInbound().getClientId(),
mqttProperties.getInbound().getTopic());
adapter.setCompletionTimeout(5000);
adapter.setConverter(new DefaultPahoMessageConverter());
adapter.setQos(1);
adapter.setOutputChannel(mqttInputChannel());
return adapter;
}
@Bean
@ServiceActivator(inputChannel = "mqttInputChannel")
public MessageHandler handler() {
return new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
//上傳經緯度
PushCallUtil.saveFreerideLocation(message.getPayload().toString());
}
};
}
}
④ 後端推送給前端接口提供
@Component
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface MqttGateway {
void sendToMqtt(String data);
void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, String payload);
void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload);
}
好了,我是張星,歡迎加入博主技術交流羣,羣號:526601468