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