SpringBoot2.0_MQTT消息订阅之动态Topic

        之前总结过两篇关于MQTT消息发布消息订阅的文章,很多朋友都觉得不错,不过也有些小疑问,特别是关于mqtt消息订阅的,如何在项目应用中,做到动态添加Topic及监听消息?很多朋友对此都有疑问,却又不知如何下手,网上资料也不多,今天就抽个空,简单做个介绍,给大家做个参考,实际项目还要做优化。对于只要求做消息订阅动态主题的朋友,只需看上半部分就够了;如果有需求,想要将mqtt封装成jar脱离具体业务项目,可以参考整篇文章。

        在MQTT功能之消息订阅处理文章中,我们将Mqtt的配置都写成一个配置类,并在配置类中实现类静态的消息监听,这次,我要将Mqtt的配置抽离封装成一个jar,然后在demo中引用这个jar。首先,我们对mqtt的订阅通道做调整:

看下原来我们怎么做的,在配置监听主题inbound里,定义MqttPahoMessageDrivenChannelAdapter adapter初始化并配置监听主题hello,hello1,这种方式是静态配置,项目运行后就不能再改变监听的topic了;

改变后,将MqttPahoMessageDrivenChannelAdapter  adapter定义成一个全局变量,还是在inbound方法里初始化,只不过,初始化时不设置主题,改成调用adapter方法提供的addTopic方法添加主题。

看到这里,朋友们会有疑问,这有什么不一样?不就只是改变了监听topic的设置方式嘛,项目运行后,还是改变不了。

没错,不过,可能有些朋友已经想到,后面要怎么做了。

就是写两个接口,一个是添加监听主题Topic接口,addListenTopic(String[] topic),还有一个移除监听主题Topic接口,removeListenTopic(String topic),然后对外开放,这就是为什么要将MqttPahoMessageDrivenChannelAdapter  adapter定义成全局变量的原因。这样,我们就可以在项目运行过程中,调用这个方法来添加主题,达到动态监听的效果了。

那对于接收到的消息,我们又改怎么处理呢?先看看原来我们怎么做的,在handler里接收到消息后直接打印;

改变后,我写了一个消息处理的MqttReceiveService接口类,里面定义了一个消息处理接口

import com.hit.entity.ResultObj;
import org.springframework.stereotype.Service;

@Service
public interface MqttReceiveService {

    ResultObj handlerMqttMessage(String topic,String jsonData);
}

然后,我们就可以在消息接收的handler()里,调用这个接口类的消息处理接口,具体业务交给实际项目的实现类去做。

至此,Mqtt消息订阅动态添加主题及消息处理改造完成,由于时间仓促,写得不是非常完善,如有不足,请朋友及时指出纠正。

最后,我们新建个简单的springboot测试demo,只需要在pom配置文件中引入写好的jar即可;先看配置文件pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.2.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <groupId>com.example</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>mqttTestDemo</name>
   <description>mqtt test demo</description>

   <properties>
      <java.version>1.8</java.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.integration</groupId>
         <artifactId>spring-integration-stream</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.integration</groupId>
         <artifactId>spring-integration-mqtt</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter</artifactId>
      </dependency>
      <!--这是我写好的basic-mqtt通用jar-->
      <dependency>
         <groupId>com.hit</groupId>
         <artifactId>basic-mqtt</artifactId> 
         <version>1.0-RELEASE</version>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
   </dependencies>
   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
</project>

在项目中,我们写个简单的实现类,实现MqttReceiveService这个接口类;

/**
 * Copyright (C), 2019-2019
 * FileName: MqttReceiveServiceImpl
 * Author:   lenovo
 * Date:     2019/6/5 11:04
 * Description:
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.example.demo.service.impl;

import com.hit.entity.ResultObj;
import com.hit.service.MqttReceiveService;
import org.springframework.stereotype.Service;

/**
 * 〈一句话功能简述〉<br>
 * 〈〉
 *
 * @author lenovo
 * @create 2019/6/5
 * @since 1.0.0
 */
@Service
public class MqttReceiveServiceImpl implements MqttReceiveService {
    @Override
    public ResultObj handlerMqttMessage(String topic,String s) {
        System.out.println("this topic is : "+topic+" ,this data : "+s);
        return null;
    }

}

最后,看看springboot启动类,

然后,我们运行demo测试看看:

第一,我们没有监听T10主题,所以往T10主题发送消息,demo也不会接收到任何消息,所以控制台不输出;

接下来,我们调用addTopic(String[] topic)接口,添加监听主题,然后再发布消息,看控制台输出:

移除监听主题Topic功能逻辑是一样的,有兴趣的同学可以自己测试一下。

时间匆忙,写的不够完善,如有错误,还请朋友及时指出纠正。

【转载请注明出处——大道迷途】

发布了10 篇原创文章 · 获赞 40 · 访问量 5万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览