mqtt實現前後端實時互動
阿新 • • 發佈:2018-12-11
1.場景還原
2.設計思路
首先,後端在工程中配置需要訂閱的通配topic,主要是為了能夠接收前端傳過來的請求;然後前端在初始化的時候也需要訂閱具體的相關主題,為了能夠接收後端傳來的請求,這裡後端需要提供一個訂閱主題的介面供前端呼叫
3.實現方案
①生產端
/** * @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