关于spring boot集成MQTT
安装
说到mqtt,首先肯定要安装了,安装什么的地址:http://activemq.apache.org/ap...
我本地是Windows的环境,所以装的是Windows版本,这里是第一个注意的地方,因为后面使用的时候windows和linux的有一些不同
下载完成之后就是解压安装了,这里解压完成之后进入bin目录下,自己用cmd或者直接进去在此处打开命令窗口也行,然后运行apollo.cmd 创建一个服务实例我的实例名称是mybroker所以命令是 apollo.cmd create mybroker,这个名称自己可以随便指定
创建完实例后发现bin 目录下多了一个文件夹,这个文件夹就是你实例名称,进入文件夹运行
.apollo-broker.cmd run 命令
这样就启动成功了
启动成功可以去http://localhost:61680/console/index.html看看,登录账号和密码在mybrokeretcusers.properties文件中找到输入就可以进去了
页面上有连接信息和订阅主题的一些对应信息,有兴趣的自己看下,后面也会讲到的
使用
安装成功接下来就是使用了,首先创建一个maven工程,引入配置
<!--mqtt-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
</dependency>
由于我们后面处理订阅消息的消费者打印的日志是用了slf4j为了方便也引入了lombok的配置 :
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
引入完成以后就可以开始准备开始使用mqtt了
这里为了方便维护和配置我把一些配置参数放在了properties文件里面:
#MQTT配置信息
spring.mqtt.username=admin
spring.mqtt.password=password
spring.mqtt.url=tcp://localhost:61613
spring.mqtt.client.id=clientId
spring.mqtt.server.id=serverId
spring.mqtt.default.topic=topic
这里我遇到了一个坑,专门注释了,就是订阅端订阅消息的id 和 发布端发布消息的id 一定不能一样,这样会导致mqtt识别到两个一样的id,消息一发就断开连接了,订阅端总是收不到消息,这个问题我找了好长时间都不知道问题出在哪,刚接触的很容易搞错,第二个问题就是mqtt的服务器连接地址,在Windows和linux下tcp的端口是不一样的,在启动的apollo的日志中可以看出来
监听的tcp端口是61613,看别人很多的demo上都是1883,如果一直连不上,原因可能是因为这个
接下来就是spring.mqtt.default.topic
配置了,这个是mqtt订阅和推送的消息主题,既然你想发消息那么订阅消息的主题和发布消息的主题一致才能收到消息,和rabbitmq一样
然后就是客户端
@Configuration
@IntegrationComponentScan
@Slf4j
public class MqttSenderConfig {
@Value("${spring.mqtt.username}")
private String username;
@Value("${spring.mqtt.password}")
private String password;
@Value("${spring.mqtt.url}")
private String hostUrl;
@Value("${spring.mqtt.client.id}")
private String clientId;
@Value("${spring.mqtt.default.topic}")
private String defaultTopic;
@Bean
public MqttConnectOptions getMqttConnectOptions(){
MqttConnectOptions mqttConnectOptions=new MqttConnectOptions();
mqttConnectOptions.setUserName(username);
mqttConnectOptions.setPassword(password.toCharArray());
mqttConnectOptions.setServerURIs(new String[]{hostUrl});
mqttConnectOptions.setKeepAliveInterval(2);
return mqttConnectOptions;
}
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setConnectionOptions(getMqttConnectOptions());
return factory;
}
@Bean
@ServiceActivator(inputChannel = "mqttOutboundChannel")
public MessageHandler mqttOutbound() {
MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId, mqttClientFactory());
messageHandler.setAsync(true);
messageHandler.setDefaultTopic(defaultTopic);
return messageHandler;
}
@Bean
public MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
}
这里有点问题,如果你是复制我的代码的话MessageHandler 这个类是没有的需要自己手动导包,看了源码发现这里需要的是一个消息处理的handler需要是org.springframework.messaging.MessageHandler的实现,直接导入这个包就行了
@Component
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface MsgWriter {
void sendToMqtt(String data);
void sendToMqtt(String payload,@Header(MqttHeaders.TOPIC) String topic);
void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload);
}
这个是消息发送接口,需要发送消息的时候直接调用就行了,提供了几个重载方法payload或者data是发送消息的内容
topic是消息发送的主题,这里可以自己灵活定义,也可以使用默认的主题,就是配置文件的主题,qos是mqtt 对消息处理的几种机制分为0,1,2 其中0表示的是订阅者没收到消息不会再次发送,消息会丢失,1表示的是会尝试重试,一直到接收到消息,但这种情况可能导致订阅者收到多次重复消息,2相比多了一次去重的动作,确保订阅者收到的消息有一次
当然,这三种模式下的性能肯定也不一样,qos=0是最好的,2是最差的 ,有兴趣的可以去详细了解我在这不多赘述
上面就完成了消息的发送,可以去http://localhost:61680/console/index.html看看消息的记录,这里我写了一个接口调用sendToMqtt方法发送一条消息
会看到收到有两个主题,我的是因为我订阅了两个主题所以上面显示的是两个,我的刚才发布消息的主题是too所以打开会看到too有消息送达过来
如果你还没写订阅方的话consumers是没有的,现在显示我发了7条消息,证明发送成功了
接下来就是订阅方,为了方便我就直接写在启动类上了,没有用到所有的配置
@SpringBootApplication
@EnableAutoConfiguration
public class MytestApplication {
public static void main(String[] args) {
SpringApplication.run(MytestApplication.class, args);
}
@Value("${spring.mqtt.server.id}")
private String serverId;
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setServerURIs("tcp://localhost:61613");
factory.setUserName("admin");
factory.setPassword("password");
return factory;
}
// consumer 订阅者监听消息
@Bean
public IntegrationFlow mqttInFlow() {
return IntegrationFlows.from(mqttInbound())
.transform(p -> p + ", received from MQTT")
.handle(logger())
.get();
}
private LoggingHandler logger() {
LoggingHandler loggingHandler = new LoggingHandler("INFO");
loggingHandler.setLoggerName("siSample");
return loggingHandler;
}
@Bean
public MessageProducerSupport mqttInbound() {
MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(serverId,
mqttClientFactory(), "too");
adapter.setCompletionTimeout(5000);
adapter.setConverter(new DefaultPahoMessageConverter());
adapter.setQos(1);
return adapter;
}
}
这里订阅的主题可以指定,我订阅的是刚才发的too主题,还有订阅方的id 别和发送方的id 一样
重新启动项目,发送消息,会发现控制台已经打印出消息
代表订阅方已经成功收到消息,同时
也显示消息订阅方和记录,至此一个完整的消息发送和订阅完成,比较简单,但是一不留神很容易出现问题,希望能帮助到新入门的人
关于spring boot集成MQTT的更多相关文章
- Spring Boot 集成 MQTT
本文代码有些许问题,处理方案见:解决 spring-integration-mqtt 频繁报 Lost connection 错误 一.添加配置 spring: mqtt: client: usern ...
- spring boot 集成mqtt
1.pom文件中添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifact ...
- Spring Boot集成Jasypt安全框架
Jasypt安全框架提供了Spring的集成,主要是实现 PlaceholderConfigurerSupport类或者其子类. 在Sring 3.1之后,则推荐使用PropertySourcesPl ...
- Spring boot集成swagger2
一.Swagger2是什么? Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件. Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格 ...
- Spring Boot 集成 Swagger,生成接口文档就这么简单!
之前的文章介绍了<推荐一款接口 API 设计神器!>,今天栈长给大家介绍下如何与优秀的 Spring Boot 框架进行集成,简直不能太简单. 你所需具备的基础 告诉你,Spring Bo ...
- spring boot 集成 zookeeper 搭建微服务架构
PRC原理 RPC 远程过程调用(Remote Procedure Call) 一般用来实现部署在不同机器上的系统之间的方法调用,使得程序能够像访问本地系统资源一样,通过网络传输去访问远程系统资源,R ...
- Spring Boot 集成Swagger
Spring Boot 集成Swagger - 小单的博客专栏 - CSDN博客https://blog.csdn.net/catoop/article/details/50668896 Spring ...
- spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,guava限流,定时任务案例, 发邮件
本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...
- Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件
上一篇文章,写了如何搭建一个简单的Spring boot项目,本篇是接着上一篇文章写得:Spring boot入门:快速搭建Spring boot项目(一),主要是spring boot集成mybat ...
随机推荐
- Java-公约公倍
题目: 如果两个数很大,怎样求最大公约数,最小公倍数?如果是n个数呢?比如1000个数的最小公倍数 分析:求a和b的最大公约数——辗转相除法(又叫欧几里得定理).即找到一个数,能对a,b都除尽.对于这 ...
- c++精度
- CF1237F Balanced Domino Placements
题意 给定一个 \(h\) 行 \(w\) 列的方格图,上面已经放置了一些 \(1\times 2\) 的多米诺骨牌. 我们称一个放置多米诺骨牌的方案是好的,当且仅当任何两个多米诺骨牌不占用相同的行与 ...
- CF573E Bear and Bowling(6-1)
题意 洛谷 做法一 考虑一种贪心(先别管对不对),设当前已选择的集合为\(A\),这是考虑该集合的补集,每个元素加进来后的增量为\(V_i\),则挑选最大的那个加入该集合 结论1:遵循上述贪心,\(\ ...
- Linux shell 只删除目录下所有(不知道文件名字)文件,只删除文件夹
#!/bin/sh RM="rm -rf" function delete_all_dir() { for i in `ls` do if [ -d $i ];then $RM $ ...
- 1级搭建类110-Oracle 18c SI FS(Windows Server 2019)公开
Oracle 18c 单实例文件系统在Windows Server 2019上的安装 在线查看
- 回溯经典(指定位置N皇后问题)
N皇后问题自不必多说,这道题的先行条件是在放置的时候已经指定了一个棋子的位置. 输入第一行为N,第二行为指定棋子的坐标(x,y):输出方案总数以及按字典序升序的各种方案. 思路: 首先是回溯,其次对待 ...
- C# LINQ学习笔记二:LINQ标准查询操作概述
本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5801249.html,记录一下学习过程以备后续查用. “标准查询运算符”是组成语言集成查询 (LINQ) 模式 ...
- CentOS 安装后的常用配置
镜像配置 CentOS系统的镜像配置文件路径在 /etc/yum.repos.d/CentOS-Base.repo, 将镜像内容copy到 CentOS-Base.repo中 然后运行 yum mak ...
- 将Python模块转变为命令行工具
问:如何输入命令行就能执行python代码呢? 答:要将python模块转变为命令行工具只用在 setup.py 文件中添加参数entry_points 例如: entry_points={ 'con ...