SpringBoot+MQTT+apollo实现订阅发布功能的示例

作者:来串糖葫芦 时间:2021-08-30 22:36:46 

由于最近公司在开发一款后台与安卓的更新系统,经过再三研究之后,也是选择Mqtt这个目前流行的框架。为了能够让项目运营起来,最终虽说是选择ActiveMQ。但在这个过程中,也是发现Apollo作为服务器也是相当不错。当然对于后者已经被apace放弃,不过今天还是和大家整理一下SpringBoot+MQTT+apollo实现订阅发布功能的全过程。

对于项目首先需要用到的前提东西,比如Apollo如何下载,以及MQTT测试工具在这里就不多说。如果真的不懂私聊Damon吧,在这里就不浪费时间。

对于项目,首先你所需要引入maven包:

pom.xml


 <!-- MQTT -->
 <dependency>
   <groupId>org.springframework.integration</groupId>
   <artifactId>spring-integration-stream</artifactId>
 </dependency>
 <dependency>
   <groupId>org.springframework.integration</groupId>
   <artifactId>spring-integration-mqtt</artifactId>
 </dependency>

其目标就是将MQTT用在项目组中
接着就是项目yml文件的配置,使用properties,以葫芦画瓢就行了:

applicaiton.yml


mqtt:
username: admin
password: password
host-url: tcp://127.0.0.1:8161 # 你自己服务器的地址和端口,这个需要改
clientID: test1    # 这个改不改随意,但不同的客户端肯定不能一样
default-topic: home/garden/fountain   # 默认主题
timeout: 100
keepalive: 100

# Tomcat
server:
tomcat:
 uri-encoding: UTF-8
 max-threads: 1000
 min-spare-threads: 30
port: 8088

注意host-url,这就是你apollo的地址

来到第三步,此时就是项目内的文件:

MqttConfig文件


@Component
@ConfigurationProperties("mqtt")
@Setter
@Getter
public class MqttConfig {
 @Autowired
 private MqttPushClient mqttPushClient;

/**
  * 用户名
  */
 // @Value("username")
 private String username;
 /**
  * 密码
  */
 private String password;
 /**
  * 连接地址
  */
 private String hostUrl;
 /**
  * 客户Id
  */
 private String clientID;
 /**
  * 默认连接话题
  */
 private String defaultTopic;
 /**
  * 超时时间
  */
 private int timeout;
 /**
  * 保持连接数
  */
 private int keepalive;

@Bean
 public MqttPushClient getMqttPushClient() {
   System.out.println("hostUrl: "+ hostUrl);
   System.out.println("clientID: "+ clientID);
   System.out.println("username: "+ username);
   System.out.println("password: "+ password);
   System.out.println("timeout: "+timeout);
   System.out.println("keepalive: "+ keepalive);
   mqttPushClient.connect(hostUrl, clientID, username, password, timeout, keepalive);
   // 以/#结尾表示订阅所有以test开头的主题
   mqttPushClient.subscribe(defaultTopic, 0);
   return mqttPushClient;
 }
}

目的就是配置所对应的消息

第四步就是发布以及订阅等功能:

MqttPushClient


@Component
public class MqttPushClient {
 private static final Logger logger = LoggerFactory.getLogger(MqttPushClient.class);

@Autowired
 private PushCallback pushCallback;

private static MqttClient client;

private static MqttClient getClient() {
   return client;
 }

private static void setClient(MqttClient client) {
   MqttPushClient.client = client;
 }

/**
  * 客户端连接
  *
  * @param host   ip+端口
  * @param clientID 客户端Id
  * @param username 用户名
  * @param password 密码
  * @param timeout  超时时间
  * @param keepalive 保留数
  */
 public void connect(String host, String clientID, String username, String password, int timeout, int keepalive) {
   MqttClient client;
   try {
     client = new MqttClient(host, clientID, new MemoryPersistence());
     MqttConnectOptions options = new MqttConnectOptions();
     options.setCleanSession(true);
     options.setUserName(username);
     options.setPassword(password.toCharArray());
     options.setConnectionTimeout(timeout);
     options.setKeepAliveInterval(keepalive);
     MqttPushClient.setClient(client);
     try {
       client.setCallback(pushCallback);
       client.connect(options);
     } catch (Exception e) {
       e.printStackTrace();
     }
   } catch (Exception e) {
     e.printStackTrace();
   }
 }

/**
  * 发布
  *
  * @param qos     连接方式
  * @param retained  是否保留
  * @param topic    主题
  * @param pushMessage 消息体
  */
 public void publish(int qos, boolean retained, String topic, String pushMessage) {
   MqttMessage message = new MqttMessage();
   message.setQos(qos);
   message.setRetained(retained);
   message.setPayload(pushMessage.getBytes());
   MqttTopic mTopic = MqttPushClient.getClient().getTopic(topic);
   if (null == mTopic) {
     logger.error("topic not exist");
   }
   MqttDeliveryToken token;
   try {
     token = mTopic.publish(message);
     token.waitForCompletion();
   } catch (MqttPersistenceException e) {
     e.printStackTrace();
   } catch (MqttException e) {
     e.printStackTrace();
   }
 }

/**
  * 订阅某个主题
  *
  * @param topic 主题
  * @param qos  连接方式
  */
 public void subscribe(String topic, int qos) {
   logger.info("开始订阅主题" + topic);
   try {
     MqttPushClient.getClient().subscribe(topic, qos);
   } catch (MqttException e) {
     e.printStackTrace();
   }
 }
}

订阅主题以及发布的方式等内容更多编写
最后在搞个测试看看我们的结果是否正确:

TestController


@RestController
@RequestMapping("/")
public class TestController {

@Autowired
 private MqttPushClient mqttPushClient;

@GetMapping(value = "/publishTopic")
 public String publishTopic() {
   String topicString = "home/garden/fountain";
   mqttPushClient.publish(0, false, topicString, "测试一下发布消息");
   return "ok";
 }
 // 发送自定义消息内容(使用默认主题)
 @RequestMapping("/publishTopic/{data}")
 public String test1(@PathVariable("data") String data) {
   String topicString = "home/garden/fountain";
   mqttPushClient.publish(0,false,topicString, data);
   return "ok";
 }

// 发送自定义消息内容,且指定主题
 @RequestMapping("/publishTopic/{topic}/{data}")
 public String test2(@PathVariable("topic") String topic, @PathVariable("data") String data) {
   mqttPushClient.publish(0,false,topic, data);
   return "ok";
 }
}

如此一来就OK!

你可以使用MQTT.fx进行测试。用Postman发出,就能够查看最终的结果。在这里,因为时间的原因就不多说,有啥有趣的问题,咱们可以一同探讨。 希望你希望,Damon将会不断的分享各种有趣的开发小故事给大家娱乐。下一期,或在POI实现导出导入或者是ActiveMQ进行选择。

来源:https://juejin.im/post/5ee79c8e6fb9a047bf70892b

标签:SpringBoot,MQTT,apollo,订阅
0
投稿

猜你喜欢

  • Java按时间梯度实现异步回调接口的方法

    2023-11-09 10:30:29
  • SpringCloud Feign配置应用详细介绍

    2023-07-14 04:23:03
  • Springboot 使用maven release插件执行版本管理及打包操作

    2023-07-12 01:20:35
  • 一文梳理Java 8后的新功能

    2023-07-13 07:41:43
  • SpringMVC执行过程详细讲解

    2023-06-07 10:04:54
  • android使用PullToRefresh实现下拉刷新和上拉加载

    2023-08-06 11:06:58
  • Spring3 整合MyBatis3 配置多数据源动态选择SqlSessionFactory详细教程

    2023-03-21 21:22:27
  • Springboot 异步任务和定时任务的异步处理

    2022-08-20 07:21:12
  • Java8新特性之空指针异常的克星Optional类的实现

    2023-08-04 18:59:53
  • Java编程泛型限定代码分享

    2023-11-09 17:46:32
  • Java读写txt文件时防止中文乱码问题出现的方法介绍

    2023-06-23 04:40:32
  • Java+Nginx实现POP、IMAP、SMTP邮箱代理服务

    2023-11-26 10:31:47
  • Java中Servlet的生命周期详解

    2023-09-10 03:57:59
  • 使用Java开发实现OAuth安全认证的应用

    2023-07-16 13:55:44
  • 浅析Java多线程同步synchronized

    2023-05-20 15:52:29
  • java 引用传递的三种类型小结

    2023-09-03 03:59:47
  • Logback日志基础及自定义配置代码实例

    2022-09-04 01:01:41
  • Java与C++实现相同的MD5加密算法简单实例

    2023-08-31 09:43:02
  • Spring使用三级缓存解决循环依赖的问题

    2023-03-14 09:06:15
  • 关于java数组与字符串相互转换的问题

    2021-08-08 18:50:31
  • asp之家 软件编程 m.aspxhome.com