java mqtt spring_springboot集成MQTT

本文介绍了如何在Spring Boot应用中集成MQTT,使用Spring Integration的5.2.1.RELEASE版本。文章详细讲解了入站和出站适配器的配置,包括MqttPahoMessageDrivenChannelAdapter和MqttPahoMessageHandler的使用,以及如何通过Java配置和Java DSL进行配置。此外,还展示了如何动态添加和移除订阅主题,以及如何处理连接失败和恢复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring的MQTT 支持

spring-integration的版本为:5.2.1

Spring Integration提供了入站适配器和出站适配器以支持MQTT协议。

你需要在你的项目中加入spring-integration-mqtt依赖:

Maven:

org.springframework.integration

spring-integration-mqtt

5.2.1.RELEASE

Gradle:

compile "org.springframework.integration:spring-integration-mqtt:5.2.1.RELEASE"

当前的实现采用的是Eclipse Paho MQTT Client库。

入站适配器和出站的适配器的配置都是通过DefaultMqttPahoClientFactory实现的。关于更多的配置选项可以查看Paho的文档。

我们推荐你配置一个MqttConnectOptions对象,并把它注入到连接工厂中,而不是在连接工厂中自己设置。

入站(消息驱动)通道适配器

入站适配器是通过MqttPahoMessageDrivenChannelAdapter来实现的。为方便起见,你可以使用命名空间来配置,最小的配置如下:

class="org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory">

client-id="${mqtt.default.client.id}.src"

url="${mqtt.url}"

topics="sometopic"

client-factory="clientFactory"

channel="output"/>

下面这段配置展示了可以用到的属性:

client-id="foo"

url="tcp://localhost:1883"

topics="bar,baz"

qos="1,2"

converter="myConverter"

client-factory="clientFactory"

send-timeout="123"

error-channel="errors"

recovery-interval="10000"

channel="out" />

client-id 客户端id

url broker的地址

topics 此适配器接收消息的主题,以逗号分割

qos 逗号分割的Qos值

converter 此处指的是MqttMessageConverter,可选。默认会使用DefaultPahoMessageConver,此消息转换器会产生一个消息体为字符串的消息,这个消息带有这些头信息:

. mqtt_topic : 消息来自于哪一个topic

. mqtt_duplicate: true,如果此消息为重复消息的话

. mqtt_qos : 消息的Qos

client-factory 客户端工厂

send-timeout 发送的超时时间。它只在通道阻塞时起作用

error-channel 错误通道:下载流的异常会以ErrorMessage的形式被发送到此通道内。消息体为MessagingException

,MessagingException 中包含有失败信息和原因。

recovery-interval 恢复的时间间隔,此选项控制着适配器在失败后重连的间隔时间,默认是10000ms即10s。

注意:

从4.1开始,你可以在上面的配置中省略URL,而只需要在DefaultMqttPahoClientFactory中配置serverURIs 即可。开启这项配置,你可以连接到一个高可用的集群。

从4.2.2开始,如果此适配器成功订阅这些topic,就会生成一个MqttSubscribedEvent 事件。当连接或订阅失败时,会生成一个MqttConnectionFailedEvent事件。只要我们定义一个ApplicationListener的类,就可以接收这些事件。同样,recoveryInterval 此选项控制着适配器在失败后重连的间隔时间,默认是10000ms即10s。

注意:

xxxx

注意:

xxxx

在运行时添加和移除topic

从4.1版本开始,你可以通过程序来修改此适配器订阅的topic。Spring Integration提供了addTopic()和removeTopic()方法。

在添加topic时,你可以指定Qos值(如果不指定的话,默认值是1)。你也可以发送一个带有特定消息体的消息给来修改topic。例如: "myMqttAdapter.addTopic('foo', 1)"。

停止和启动适配器对主体列表不会产生影响(它不会恢复原来在配置中所做的设置)。应用上下文的生命周期之外,这些修改不会被保留下来。一个新的应用上下文会恢复到所做的配置。

在适配器停止时(或与broker断开连接时),修改主题,会在下一次新连接建立时,生效。

使用java进行配置

下面这个示例展示了如何使用java配置入站适配器:

@SpringBootApplication

public class MqttJavaApplication {

public static void main(String[] args) {

new SpringApplicationBuilder(MqttJavaApplication.class)

.web(false)

.run(args);

}

@Bean

public MessageChannel mqttInputChannel() {

return new DirectChannel();

}

@Bean

public MessageProducer inbound() {

MqttPahoMessageDrivenChannelAdapter adapter =

new MqttPahoMessageDrivenChannelAdapter("tcp://localhost:1883", "testClient",

"topic1", "topic2");

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 {

System.out.println(me

### 如何将MQTTSpring Boot集成 在现代分布式系统中,消息传递机制至关重要。为了实现实时数据传输和设备间通信,许多开发者选择使用轻量级的消息队列遥测传输协议(MQTT)。以下是有关如何将MQTTSpring Boot集成的具体方法。 #### Maven依赖配置 要开始集成过程,首先需要引入必要的Maven依赖项。这些依赖项允许Spring Boot应用程序通过Eclipse Paho库或其他工具与MQTT代理进行交互[^4]: ```xml <dependencies> <!-- MQTT --> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> </dependency> <!-- JSON解析 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.13</version> </dependency> </dependencies> ``` #### 配置文件设置 接下来,在`application.properties`或`application.yml`中定义MQTT客户端的连接参数。此部分通常包括主机地址、端口以及认证信息等: ```properties # MQTT Configuration spring.mqtt.host=tcp://broker.hivemq.com spring.mqtt.port=1883 spring.mqtt.username= spring.mqtt.password= spring.mqtt.default-topic=test/topic ``` 如果采用YAML格式,则可以这样写: ```yaml spring: mqtt: host: tcp://broker.hivemq.com port: 1883 username: password: default-topic: test/topic ``` #### 客户端初始化 创建一个Java类用于管理MQTT客户端实例。该类负责订阅主题并处理接收到的消息。以下是一个简单的示例代码片段[^1][^3]: ```java import org.eclipse.paho.client.mqttv3.IMqttClient; import org.eclipse.paho.client.mqttv3.MqttCallbackExtended; import org.eclipse.paho.client.mqttv3.MqttMessage; public class MqttConfig { private IMqttClient client; public void connect(String brokerUrl, String clientId) throws Exception { this.client = new org.eclipse.paho.client.mqttv3.MqttClient(brokerUrl, clientId); // 设置回调函数 client.setCallback(new MqttCallbackExtended() { @Override public void messageArrived(String topic, MqttMessage message) throws Exception { System.out.println("Received Message: " + new String(message.getPayload())); } @Override public void connectionLost(Throwable cause) {} @Override public void deliveryComplete(IMqttDeliveryToken token) {} @Override public void connectComplete(boolean reconnect, String serverURI) {} }); // 连接到代理 client.connect(); } } ``` #### 使用连接池优化性能 对于高并发场景下的大规模应用,建议利用连接池技术提升系统的吞吐能力和稳定性。具体实现方式可以通过自定义线程池或者借助第三方框架完成[^2]。 --- ### 总结 上述内容展示了从基础到高级的不同层次上的Spring Boot与MQTT集成方案。无论是小型实验项目还是生产级别的复杂部署,都可以找到适合的技术路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值