paho架构_基于paho springboot集成mqtt实现消息的发布订阅 - 人人都是架构师

本文介绍了如何使用Paho库在SpringBoot应用中集成MQTT,包括添加依赖、配置YAML文件、创建MQTT消息配置类以及定义消息发送接口。通过配置消息通道和服务激活器,实现了消息的发布和订阅功能。
摘要由CSDN通过智能技术生成

1、首先添加pom依赖

org.springframework.boot

spring-boot-starter-integration

org.springframework.integration

spring-integration-stream

org.springframework.integration

spring-integration-mqtt

2、application.yml文件配置

spring:

mqtt:

username: admin

password: password

url: tcp://127.0.0.1:1883

keepAliveInterval: 2

client:

id: mqttId

default:

topic: topic

3、MQTT消息配置类

import org.eclipse.paho.client.mqttv3.MqttConnectOptions;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.integration.annotation.IntegrationComponentScan;

import org.springframework.integration.annotation.ServiceActivator;

import org.springframework.integration.channel.DirectChannel;

import org.springframework.integration.core.MessageProducer;

import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;

import org.springframework.integration.mqtt.core.MqttPahoClientFactory;

import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;

import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;

import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter;

import org.springframework.messaging.Message;

import org.springframework.messaging.MessageChannel;

import org.springframework.messaging.MessageHandler;

import org.springframework.messaging.MessagingException;

import org.springframework.stereotype.Component;

@Component

@IntegrationComponentScan

public class MqttConfig {

private static final Logger logger = LoggerFactory.getLogger(MqttConfig.class);

/**

* 订阅的bean名称

*/

public static final String CHANNEL_NAME_IN = "mqttInboundChannel";

/**

* 发布的bean名称

*/

public static final String CHANNEL_NAME_OUT = "mqttOutboundChannel";

@Value("${spring.mqtt.url}")

private String hostUrl;

@Value("${spring.mqtt.client.id}")

private String clientId;

@Value("${spring.mqtt.default.topic}")

private String defaultTopic;

@Value("${spring.mqtt.username}")

private String userName;

@Value("${spring.mqtt.password}")

private String passWord;

@Value("${spring.mqtt.keepAliveInterval}")

private int keepAliveInterval;

@Bean

public MqttConnectOptions getMqttConnectOptions(){

MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();

mqttConnectOptions.setUserName(userName);

mqttConnectOptions.setPassword(passWord.toCharArray());

mqttConnectOptions.setServerURIs(new String[]{hostUrl});

mqttConnectOptions.setKeepAliveInterval(keepAliveInterval);

return mqttConnectOptions;

}

@Bean

public MqttPahoClientFactory mqttClientFactory(){

DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();

factory.setConnectionOptions(getMqttConnectOptions());

return factory;

}

//发送通道

@Bean(name = CHANNEL_NAME_OUT)

public MessageChannel mqttOutboundChannel() {

return new DirectChannel();

}

@Bean

@ServiceActivator(inputChannel = CHANNEL_NAME_OUT)

public MessageHandler MqttOutbound(){

MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId+"_Send",mqttClientFactory());

messageHandler.setAsync(true);

messageHandler.setDefaultTopic(defaultTopic);

return messageHandler;

}

//接收通道

@Bean(name = CHANNEL_NAME_IN)

public MessageChannel mqttInboundChannel() {

return new DirectChannel();

}

//配置client,监听的topic

@Bean

public MessageProducer inbound() {

MqttPahoMessageDrivenChannelAdapter adapter =

new MqttPahoMessageDrivenChannelAdapter(clientId + "_inbound",mqttClientFactory(),"hello","hello1");

adapter.setCompletionTimeout(5000);

adapter.setConverter(new DefaultPahoMessageConverter());

adapter.setQos(1);

adapter.setOutputChannel(mqttInboundChannel());

return adapter;

}

@Bean

@ServiceActivator(inputChannel = CHANNEL_NAME_IN)

public MessageHandler handler() {

return new MessageHandler() {

//消息消费

@Override

public void handleMessage(Message> message) throws MessagingException {

logger.error("===================={}============", message.getPayload());

}

};

}

}

4、消息发送接口

import com.mqtt.config.MqttConfig;

import org.springframework.integration.annotation.MessagingGateway;

import org.springframework.integration.mqtt.support.MqttHeaders;

import org.springframework.messaging.handler.annotation.Header;

import org.springframework.stereotype.Component;

@Component

@MessagingGateway(defaultRequestChannel = MqttConfig.CHANNEL_NAME_OUT)

public interface MqttGateway {

/**

* 发送信息到MQTT服务器

*

* @param data 发送的文本

*/

void sendToMqtt(String data);

/**

* 发送信息到MQTT服务器

*

* @param topic 主题

* @param payload 消息主体

*/

void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic,

String payload);

/**

* 发送信息到MQTT服务器

*

* @param topic 主题

* @param qos 对消息处理的几种机制。
0 表示的是订阅者没收到消息不会再次发送,消息会丢失。

* 1 表示的是会尝试重试,一直到接收到消息,但这种情况可能导致订阅者收到多次重复消息。

* 2 多了一次去重的动作,确保订阅者收到的消息有一次。

* @param payload 消息主体

*/

void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic,

@Header(MqttHeaders.QOS) int qos,

String payload);

}

5、启动类

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class MytestApplication {

public static void main(String[] args) {

SpringApplication.run(MytestApplication.class, args);

}

}

6、测试发送消息

import com.mqtt.entity.MqttGateway;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)

@SpringBootTest

public class DemoApplicationTests {

@Autowired

private MqttGateway mqttGateway;

@Test

public void contextLoads() {

mqttGateway.sendToMqtt("topic", "hello");

}

}

订阅主题后,运行程序,可以接收到发布的消息

Spring Boot集成RabbitMQ和MQTT可以使用Spring Boot的AMQP和Paho客户端库。以下是集成步骤: 1. 添加依赖 在pom.xml中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.0</version> </dependency> ``` 2. 配置RabbitMQ连接 在application.properties中配置RabbitMQ连接信息: ``` spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` 3. 创建RabbitMQ消息接收者 创建一个类来接收RabbitMQ消息。在该类中,使用@RabbitListener注解标记方法,指定队列名称和消息处理方法。 ``` @Component public class RabbitMQReceiver { @RabbitListener(queues = "test") public void receive(String message) { // 处理消息 } } ``` 4. 创建MQTT消息接收者 创建一个类来接收MQTT消息。在该类中,实现MqttCallback接口,重写messageArrived方法来处理接收到的消息。 ``` @Component public class MQTTReceiver implements MqttCallback { @Override public void connectionLost(Throwable throwable) { // 连接丢失 } @Override public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception { // 处理消息 } @Override public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { // 消息发送完成 } } ``` 5. 创建RabbitMQ消息发送者 创建一个类来发送RabbitMQ消息。在该类中,注入AmqpTemplate并调用convertAndSend方法来发送消息到指定队列。 ``` @Component public class RabbitMQSender { @Autowired private AmqpTemplate amqpTemplate; public void send(String message) { amqpTemplate.convertAndSend("test", message); } } ``` 6. 创建MQTT消息发送者 创建一个类来发送MQTT消息。在该类中,注入MqttClient并调用connect、publish和disconnect方法来发送消息。 ``` @Component public class MQTTSender { @Autowired private MqttClient mqttClient; @Autowired private MqttConnectOptions mqttConnectOptions; public void send(String topic, String message) throws MqttException { MqttMessage mqttMessage = new MqttMessage(message.getBytes()); mqttClient.connect(mqttConnectOptions); mqttClient.publish(topic, mqttMessage); mqttClient.disconnect(); } } ``` 以上是在Spring Boot中集成RabbitMQ和MQTT实现消息订阅和发送的基本步骤。需要注意的是,AMQP和MQTT是不同的消息协议,需要根据实际情况选择使用哪个协议。另外,需要确保网络通畅,否则可能会出现消息丢失等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值