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

 更新时间:2020年06月16日 14:53:03   作者:来串糖葫芦  
这篇文章主要介绍了SpringBoot+MQTT+apollo实现订阅发布功能的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

由于最近公司在开发一款后台与安卓的更新系统,经过再三研究之后,也是选择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进行选择。

到此这篇关于SpringBoot+MQTT+apollo实现订阅发布功能的示例的文章就介绍到这了,更多相关SpringBoot+MQTT+apollo订阅发布内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring cloud consul注册的服务报错critical的解决

    spring cloud consul注册的服务报错critical的解决

    这篇文章主要介绍了spring cloud consul注册的服务报错critical的解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Java使用ProcessBuilder API优化流程

    Java使用ProcessBuilder API优化流程

    Java 的 Process API 为开发者提供了执行操作系统命令的强大功能,这篇文章将详细介绍如何使用 ProcessBuilder API 来方便的操作系统命令,需要的可以收藏一下
    2023-06-06
  • Java 关系运算符详情及案例(下)

    Java 关系运算符详情及案例(下)

    这篇文章主要介绍了Java 关系运算符详情及案例的实现,主要续上篇文章,上一篇文章我们讲到“等于”运算符 (==)、“不等于”运算符(!=)、“大于”运算符(>) ,这篇文章继续给大家讲解相关知识,需要的朋友可以参考一下
    2021-12-12
  • 利用java制作一个小的目录查询器的方法

    利用java制作一个小的目录查询器的方法

    下面小编就为大家带来一篇利用java制作一个小的目录查询器的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Java ArrayList扩容问题实例详解

    Java ArrayList扩容问题实例详解

    这篇文章主要介绍了Java ArrayList扩容问题实例详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • SpringBoot如何获取Get请求参数详解

    SpringBoot如何获取Get请求参数详解

    SpringBoot为我们封装了许多简便的获取请求参数的方法,下面这篇文章主要给大家介绍了关于SpringBoot如何获取Get请求参数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • java中url任意跳转漏洞的解决

    java中url任意跳转漏洞的解决

    URL任意跳转漏洞是一种安全漏洞,它发生在应用程序没有正确地验证目标URL,允许攻击者将用户重定向到恶意网站,本文就来介绍一下漏洞的解决修复方案,感兴趣的可以了解一下
    2024-06-06
  • Java实现的生成二维码和解析二维码URL操作示例

    Java实现的生成二维码和解析二维码URL操作示例

    这篇文章主要介绍了Java实现的生成二维码和解析二维码URL操作,结合实例形式分析了Java创建与解析二维码,以及文件读写等相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • Spring Boot整合mybatis并自动生成mapper和实体实例解析

    Spring Boot整合mybatis并自动生成mapper和实体实例解析

    本文是小编给大家总结的关于Spring Boot整合mybatis并自动生成mapper和实体的内容,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-05-05
  • Java输入输出流实例详解

    Java输入输出流实例详解

    这篇文章主要介绍了Java输入输出流,结合实例形式详细分析了Java常见的输入输出常用操作技巧与相关注意事项,需要的朋友可以参考下
    2018-09-09

最新评论