SpringBoot整合MQTT小结汇总

目录
  • 前言:
  • 一、什么是mqtt
  • 二、主要思想
    • 发布/订阅模式
  • 三、MQTT重要概念
    • 3.1 MQTT Client
    • 3.2 MQTT Broker
    • 3.3 MQTT Connection
    • 3.4 MQTT主要参数
  • 四、软件和Apollo
    • 4.1 安装Apollo
    • 4.2 安装Postman
    • 4.3 安装MQTTBox
  • 五、代码实现
    • 5.1 配置pom.xml
    • 5.2 配置MQTT服务器基本信息
    • 5.3 配置读取yml文件的类MqttConfiguration
    • 5.4  MQTT生产端的Handler处理
    • 5.5  MQTT消费端的Handler处理
    • 5.6 写个Controller类来进行访问控制测试
  • 六、测试
    • 6.1测试生产端的Handler
    • 6.2 测试消费端的Handler
  • 后言:

前言:

这几天在准备面试的过程中做的一个小demo,主要是用通过SpringBoot实现一个与MQTT服务交互通信,也是看着别人的项目改的,这两个技术之前都没有接触过,希望记录一下可以分享给大家,也好久没更新了,借此机会更新一波blog。在正式的开始这个项目前还是学了一下SSM和SpringBoot的基础,上手起来不会这么的无力。期间也是查阅了很多的资料和询问了诸多大佬。

好了话不多说,一步步的搭建项目和原理详解就在下面了

一、什么是mqtt

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于 TCP/IP 协议上,由 IBM 于 1999 年发明。MQTT 协议的主要特征是开放、简单、轻量级和易于实现,这些特征使得它适用于受约束的应用环境,如:

网络受限:网络带宽较低且传输不可靠
终端受限:协议运行在嵌入式设备上,嵌入式终端的处理器、内存等是受限的

通过 MQTT 协议,目前已经扩展出了数十种 MQTT 服务器端程序,可以通过 PHP、Java、Python、C、C# 等语言向 MQTT 发送消息。由于开放源代码、耗电量小等特点,MQTT 非常适用于物联网领域,如传感器与服务器的通信、传感器信息采集等。

二、主要思想

发布/订阅模式

订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。

将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相应对象间的一致性,这样会给维护、扩展和重用都带来不便。当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象需要改变时,就可以使用订阅发布模式了。

一个抽象模型有两个方面,其中一方面依赖于另一方面,这时订阅发布模式可以将这两者封装在独立的对象中,使它们各自独立地改变和复用。订阅发布模式所做的工作其实就是在解耦合。让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。

发布/订阅模式并不是 MQTT 协议特有的模式,像我们很多消息中间件都有使用发布/订阅模式,这里你是不是想说,这不就是我们所说的观察者模式嘛,还真不是,这两个模式很容易混淆。观察者模式只有观察者 + 被观察者两个角色,而发布/订阅模式还有一个经纪人 Broker;往更深层次的讲观察者和被观察者,是松耦合的关系,而发布者和订阅者,则完全不存在耦合。

在我们日常写程序时,经常遇到下面这种情况:

public void 前端业务/硬件业务()
{
    刷新界面();
    更新数据库();
    对界面更新数据();
    ………………………………
}

当有前端和硬件业务产生时,需要依次要去执行:刷新界面()、更新数据库()、对界面更新数据()等操作。表面上看代码写得很工整,其实这里面有很多的问题:

首先,这完全是面向过程开发,根本不适合大型项目。
第二,代码维护量太大。设想一下,如果产生业务后要执行10多个操作,那这将是个多么大,多少复杂的类呀,时间一长,可能连开发者自己都不知道如何去维护了。
第三,扩展性差。如果产生业务后,要增加一个声音提示()功能,怎么办呢?没错,只能加在前端业务/硬件业务()这个函数中,这样一来,就违反了“开放-关闭原则”。而且修改了原有的函数,那么在测试时,除了要测新增功能外,还要做原功能的回归测试;在一个大型项目中,做一次回归测试可能要花费大约两周左右的时间,而且前提是新增功能没有影响原来功能及产生新的bug。
那么如何把前端业务/硬件业务()函数同其他函数进行解耦合呢?别着急,下面就介绍今天的主角----订阅发布模式。见下图:

上面的流程就是对有告警信息产生()这个函数的描述。我们要做的,就是把产生告警和它需要通知的事件进行解耦,让它们之间没有相互依赖的关系,解耦合图如下:

事件触发者被抽象出来,称为消息发布者,即图中的P。事件接受都被抽象出来,称为消息订阅者,即图中的S。P与S之间通过Broker(即订阅器)连接。这样就实现了P与S的解耦。首先,P就把消息发送到指定的订阅器上,从始至终,它并不知道也不关心要把消息发向哪个S。S如果想接收消息,就要向订阅器进行订阅,订阅成功后,S就可以接收来自Broker的消息了,从始至终,S并不知道也不关心消息来源于哪个具体的P。同理,S还可以向Broker进行退订操作,成功退订后,S就无法接收到来自指定Broker的消息了。这样就完美的解决了P与S之间的解耦。

三、MQTT重要概念

3.1 MQTT Client

publisher 和 subscriber 都属于 MQTT Client,之所以有发布者和订阅者这个概念,其实是一种相对的概念,就是指当前客户端是在发布消息还是在接收消息,发布和订阅的功能也可以由同一个 MQTT Client 实现。

MQTT 客户端是运行 MQTT 库并通过网络连接到 MQTT 代理的任何设备(从微控制器到成熟的服务器)。例如,MQTT 客户端可以是一个非常小的、资源受限的设备,它通过无线网络进行连接并具有一个最低限度的库。基本上,任何使用 TCP/IP 协议使用 MQTT 设备的都可以称之为 MQTT Client。MQTT 协议的客户端实现非常简单直接,易于实施是 MQTT 非常适合小型设备的原因之一。MQTT 客户端库可用于多种编程语言。例如,Android、Arduino、C、C++、C#、Go、iOS、Java、JavaScript 和 .NET。

3.2 MQTT Broker

与 MQTT Client 对应的就是 MQTT Broker,Broker 是任何发布/订阅协议的核心,根据实现的不同,代理可以处理多达数百万连接的 MQTT Client。

Broker 负责接收所有消息,过滤消息,确定是哪个Client 订阅了每条消息,并将消息发送给对应的 Client,Broker 还负责保存会话数据,这些数据包括订阅的和错过的消息。Broker 还负责客户端的身份验证和授权。

3.3 MQTT Connection

MQTT 协议基于 TCP/IP。客户端和代理都需要有一个 TCP/IP 协议支持。

MQTT 连接始终位于一个客户端和代理之间。客户端从不直接相互连接。要发起连接,客户端向代理发送 CONNECT 消息。代理使用 CONNACK 消息和状态代码进行响应。建立连接后,代理将保持打开状态,直到客户端发送断开连接命令或连接中断。

3.4 MQTT主要参数

ClientId:ClientId 的长度可以是 1-23 个字符,在一个服务器上 ClientId 不能重复。如果超过 23 个字符,则服务器返回 CONNACK 消息中的返回码为 Identifier Rejected。在 MQTT 3.1.1 中,如果您不需要代理持有状态,您可以发送一个空的 ClientId。空的 ClientId 导致连接没有任何状态。在这种情况下,clean session 标志必须设置为 true,否则代理将拒绝连接。

Clean Session:Clean Session 标志告诉代理客户端是否要建立持久会话。在持久会话 (CleanSession = false) 中,代理存储客户端的所有订阅以及以服务质量(QoS)级别 1 或 2 订阅的客户端的所有丢失消息。 如果会话不是持久的 (CleanSession = true ),代理不为客户端存储任何内容,并清除任何先前持久会话中的所有信息。

Username/Password:MQTT 可以发送用户名和密码进行客户端认证和授权。但是,如果此信息未加密或散列,则密码将以纯文本形式发送。我们强烈建议将用户名和密码与安全传输一起使用。像 HiveMQ 这样的代理可以使用 SSL 证书对客户端进行身份验证,因此不需要用户名和密码。

Will Message:LastWillxxx 表示的是遗愿,client 在连接 broker 的时候将会设立一个遗愿,这个遗愿会保存在 broker 中,当 client 因为非正常原因断开与 broker 的连接时,broker 会将遗愿发送给订阅了这个 topic(订阅遗愿的 topic)的 client。

KeepAlive:keepAlive 是 client 在连接建立时与 broker 通信的时间间隔,通常以秒为单位。这个时间指的是 client 与 broker 在不发送消息下所能承受的最大时长。

QOS:此数字表示消息的服务质量 (QoS)。有三个级别:0、1 和 2。服务级别决定了消息到达预期接收者(客户端或代理)的保证类型。

Payload:这个是每条消息的实际内容。MQTT 是数据无关性的。可以发送任何文本、图像、加密数据以及二进制数据。

timeout:MQTT会尝试接收数据,直到timeout时间到后才会退出。

四、软件和Apollo

4.1 安装Apollo

Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。

Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。

Apollo下载地址

http://xn--apollo-np7ii83deeq211d/

相关链接:

Apollo 官方安装教程:https://github.com/ctripcorp/apollo/wiki/Quick-Start
Apollo 分布式部署官方指南:https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97
Apollo Github 地址:https://github.com/ctripcorp/apollo

4.1.1 解压,进入到D:\java\apache-apollo-1.7.1\bin 目录下,执行命令

.\apollo.cmd create mybroker2

4.1.2 进入刚刚创

4.1.2 进入刚刚创建好的mybroker/bin目录,执行:

.\apollo-broker.cmd run

4.1.3 浏览器打开地址http://127.0.0.1:61680/,默认用户名:admin,密码:password,即可登录主页面

4.2 安装Postman

4.3 安装MQTTBox

Microsoft Store里面就有。

账号密码输入即可

五、代码实现

5.1 配置pom.xml

<dependencies>
    <!--导入起步依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
			<artifactId>spring-boot-starter-integration</artifactId>
			<groupId>org.springframework.integration</groupId>
			<artifactId>spring-integration-stream</artifactId>
			<artifactId>spring-integration-mqtt</artifactId>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.0</version>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.47</version>

</dependencies>

5.2 配置MQTT服务器基本信息

在springBoot配置文件application.yml中配置,添加如下:

#mqtt配置
com:
  mqtt:
    url: tcp://127.0.0.1:61613
    clientId: mqtt_test1234
    topics: topic01,topic02
    username: admin
    password: password
    timeout: 10
    keepalive: 20

#指定服务端口
server:
  port: 8081   #一般没改过tomcat服务器的端口不用修改

5.3 配置读取yml文件的类MqttConfiguration

package com.vcarecity.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * 读取yml
 */
@Component
@ConfigurationProperties(prefix = "com.mqtt")     //对应yml文件中的com下的mqtt文件配置
public class MqttConfiguration {
	private String url;
	private String clientId;
	private String topics;
    private String username;
    private String password;
    private String timeout;
    private String keepalive;
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	public String getUsername() {
		return username;
	public void setUsername(String username) {
		this.username = username;
	public String getPassword() {
		return password;
	public void setPassword(String password) {
		this.password = password;
	public String getClientId() {
		return clientId;
	public void setClientId(String clientId) {
		this.clientId = clientId;
	public String getTopics() {
		return topics;
	public void setTopics(String topics) {
		this.topics = topics;
	public String getTimeout() {
		return timeout;
	public void setTimeout(String timeout) {
		this.timeout = timeout;
	public String getKeepalive() {
		return keepalive;
	public void setKeepalive(String keepalive) {
		this.keepalive = keepalive;
}

5.4  MQTT生产端的Handler处理

package com.vcarecity.mqtt;

import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
import com.vcarecity.config.MqttConfiguration;
/**
 * MQTT生产端
 *
 */
@Configuration
public class MqttOutboundConfiguration {
	@Autowired
	private MqttConfiguration mqttProperties;
	@Bean
	public MessageChannel mqttOutboundChannel() {
		return new DirectChannel();
	}
	public MqttPahoClientFactory mqttClientFactory() {
		DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
		String[] array = mqttProperties.getUrl().split(",");
		MqttConnectOptions options = new MqttConnectOptions();
		options.setServerURIs(array);
		options.setUserName(mqttProperties.getUsername());
		options.setPassword(mqttProperties.getPassword().toCharArray());
		// 接受离线消息
		options.setCleanSession(false); //告诉代理客户端是否要建立持久会话   false为建立持久会话
		factory.setConnectionOptions(options);
		return factory;
	@ServiceActivator(inputChannel = "mqttOutboundChannel")
	public MessageHandler mqttOutbound() {
		MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(
				mqttProperties.getClientId()+"outbound", mqttClientFactory());
		messageHandler.setAsync(true);
		return messageHandler;
}

5.5  MQTT消费端的Handler处理

实现了对inboundtopic中的主题监听,当有消息推送到inboundtopic主题上时可以接受

package com.vcarecity.mqtt;

import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.support.DefaultPahoMessageConverter;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.MessagingException;
import com.vcarecity.config.MqttConfiguration;
/**
 * MQTT消费端
 *
 */
@Configuration
@IntegrationComponentScan
public class MqttInboundConfiguration {
	@Autowired
	private MqttConfiguration mqttProperties;
	@Bean
	public MessageChannel mqttInputChannel() {
		return new DirectChannel();
	}
	public MqttPahoClientFactory mqttClientFactory() {
		DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
		    String[] array = mqttProperties.getUrl().split(",");
			MqttConnectOptions options = new MqttConnectOptions();
			options.setServerURIs(array);
			options.setUserName(mqttProperties.getUsername());
			options.setPassword(mqttProperties.getPassword().toCharArray());
			options.setKeepAliveInterval(2);
			//接受离线消息
			options.setCleanSession(false);
			factory.setConnectionOptions(options);
		return factory;
	//配置client,监听的topic
	public MessageProducer inbound() {
		String[] inboundTopics = mqttProperties.getTopics().split(",");
		MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(
				mqttProperties.getClientId()+"_inbound",mqttClientFactory(), inboundTopics);  //对inboundTopics主题进行监听
		adapter.setCompletionTimeout(5000);
		adapter.setQos(1);
		adapter.setConverter(new DefaultPahoMessageConverter());
		adapter.setOutputChannel(mqttInputChannel());
		return adapter;
	//通过通道获取数据
	@ServiceActivator(inputChannel = "mqttInputChannel")  //异步处理
	public MessageHandler handler() {
		return new MessageHandler() {
			@Override
			public void handleMessage(Message<?> message) throws MessagingException {
//				System.out.println("message:"+message);
				System.out.println("----------------------");
				System.out.println("message:"+message.getPayload());
				System.out.println("PacketId:"+message.getHeaders().getId());
				System.out.println("Qos:"+message.getHeaders().get(MqttHeaders.QOS));
				String topic = (String) message.getHeaders().get(MqttHeaders.RECEIVED_TOPIC);
				System.out.println("topic:"+topic);
			}
		};
}

5.6 写个Controller类来进行访问控制测试

package com.vcarecity.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.vcarecity.mqtt.MqttGateway;
@RestController
public class MqttPubController {

	@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
	@Autowired
	private MqttGateway mqttGateway;
	@RequestMapping("/hello")
	public String hello() {
		return "hello!";
	}
	 @RequestMapping("/sendMqtt")
	    public String sendMqtt(String  sendData){
		 	System.out.println(sendData);
	    	System.out.println("进入sendMqtt-------"+sendData);
	        mqttGateway.sendToMqtt("topic01",(String) sendData);
	        return "Test is OK";
	    }
	@RequestMapping("/sendMqttTopic")
	public String sendMqtt(String  sendData,String topic){
		//System.out.println(sendData+"   "+topic);
		//System.out.println("进入inbound发送:"+sendData);
		mqttGateway.sendToMqtt(topic,(String) sendData);
		return "Test is OK";
}

六、测试

直接调用Controller中的URL进行调用测试:

6.1测试生产端的Handler

6.2 测试消费端的Handler

使用Postman:

http://localhost:8081/sendMqttTopic?sendData=this is mq55555&topic=topic01

可以看见测试台上会出现Message消息,这边实现的是对inboundtopic中的主题监听实现:

刚开始没有出现上图效果,查了好久的bug。结果重启Apollo就好了

如果我要配置多个client,应该怎么处理呢?这个也简单

(1)我们只要配置多个通道即可,简单代码如下:

//通道2
@Bean
public MessageChannel mqttInputChannelTwo() {
    return new DirectChannel();
}
//配置client2,监听的topic:hell2,hello3
public MessageProducer inbound1() {
    MqttPahoMessageDrivenChannelAdapter adapter =
            new MqttPahoMessageDrivenChannelAdapter(clientId+"_inboundTwo", mqttClientFactory(),
                    "hello2","hello3");
    adapter.setCompletionTimeout(completionTimeout);
    adapter.setConverter(new DefaultPahoMessageConverter());
    adapter.setQos(1);
    adapter.setOutputChannel(mqttInputChannelTwo());
    return adapter;

//通过通道2获取数据
@ServiceActivator(inputChannel = "mqttInputChannelTwo")
public MessageHandler handlerTwo() {
    return new MessageHandler() {
       @Override
			public void handleMessage(Message<?> message) throws MessagingException {
//				System.out.println("message:"+message);
				System.out.println("----------------------");
				System.out.println("message:"+message.getPayload());
				System.out.println("PacketId:"+message.getHeaders().getId());
				System.out.println("Qos:"+message.getHeaders().get(MqttHeaders.QOS));
				String topic = (String) message.getHeaders().get(MqttHeaders.RECEIVED_TOPIC);
				System.out.println("topic:"+topic);
    };

(2)因为我这个项目用的是读取yml文件的,所以只需要在yml文件中的topics即可,加自己想要的topic。

topics: topic03,topic04,topic01,topic02

以上测试都可以使用MQTTBox完成

后言:

资料参考:

Spring官网对MQTT的支持:MQTT Support (spring.io)

Tackoverflow上面关于MQTT的资料,需要翻阅墙体:

Google上的MQTT论坛

参考文章:

https://blog.csdn.net/tjvictor/article/details/5223309

https://blog.csdn.net/riemann_/article/details/118686072

到此这篇关于SpringBoot整合MQTT总结的文章就介绍到这了,更多相关SpringBoot整合MQTT内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot2.0集成MQTT消息推送功能实现

    这几天在弄后端管理系统向指定的Android客户端推送消息的功能模块,查阅了网上很多博客介绍的许多方式,最终选择基于MQTT协议来实现,MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案. 实现MQTT协议的中间件有很多,我用的是Apollo服务器,如何搭建MQTT服务器,请查阅其他资料.这里,主要介绍SpringBoot2.0集成MQTT实现消息推送的功能.好,正式开始: 本文采用Gateway绑定的方式,网上也有介绍但不全面,还有其他采用Paho

  • springboot集成mqtt的实践开发

    序 MQTT(Message Queuing Telemetry Transport)是基于二进制消息的发布/订阅编程模式的消息协议,非常适合需要低功耗和网络带宽有限的IoT场景.这里简单介绍一下如何在springboot中集成. maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-integration</arti

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

    由于最近公司在开发一款后台与安卓的更新系统,经过再三研究之后,也是选择Mqtt这个目前流行的框架.为了能够让项目运营起来,最终虽说是选择ActiveMQ.但在这个过程中,也是发现Apollo作为服务器也是相当不错.当然对于后者已经被apace放弃,不过今天还是和大家整理一下SpringBoot+MQTT+apollo实现订阅发布功能的全过程. 对于项目首先需要用到的前提东西,比如Apollo如何下载,以及MQTT测试工具在这里就不多说.如果真的不懂私聊Damon吧,在这里就不浪费时间. 对于项目

  • SpringBoot集成mqtt的多模块项目配置详解

    前言 近期为了准备毕设,准备使用SpringBoot搭建mqtt后端,本篇主要记录了在IDEA中搭建SpringBoot mqtt的多模块项目的过程 开发工具及系统环境 IDE:IntelliJ IDEA 2020.2 操作系统:Windows 10 2004 Java Version:1.8 SpringBoot Version:2.1.17.RELEASE 项目路径 Study |----study-common # 存放公共类 |----study-mapper # mapper层 |--

  • springboot 实现mqtt物联网的示例代码

    Springboot整合mybatisPlus+mysql+druid+swaggerUI+ mqtt 整合mqtt整合druid整合mybatis-plus完整pom完整yml整合swaggerUi整合log4j MQTT 物联网系统基本架构本物联网系列 mqtt) 整合mqtt <!--mqtt依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>

  • SpringBoot整合MQTT并实现异步线程调用的问题

    目录 为什么选择MQTT 使用背景 代码实现 基础代码 异步线程处理实现 为什么选择MQTT MQTT的定义相信很多人都能讲的头头是道,本文章也不讨论什么高大上的东西,旨在用最简单直观的方式让每一位刚接触的同行们可以最快的应用起来 先从使用MQTT需要什么开始分析: 消息服务器 不同应用/设备之间的频繁交互 可能涉及一对多的消息传递 基于SpringBoot通过注解实现对mqtt消息处理的异步调用 使用背景 生产环境下, 由于mqtt 生产者生产的消息逐渐增多, 可能会导致消息堆积. 因此需要消

  • SpringBoot整合MQTT小结汇总

    目录 前言: 一.什么是mqtt 二.主要思想 发布/订阅模式 三.MQTT重要概念 3.1 MQTT Client 3.2 MQTT Broker 3.3 MQTT Connection 3.4 MQTT主要参数 四.软件和Apollo 4.1 安装Apollo 4.2 安装Postman 4.3 安装MQTTBox 五.代码实现 5.1 配置pom.xml 5.2 配置MQTT服务器基本信息 5.3 配置读取yml文件的类MqttConfiguration 5.4  MQTT生产端的Hand

  • Springboot整合mqtt服务的示例代码

    首先在pom文件里引入mqtt的依赖配置 <!--mqtt--> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.4</version> </dependency> 其次在springboot 的配置yml文件,配

  • springboot整合mybatis中的问题及出现的一些问题小结

    1.springboot整合mybatis mapper注入时显示could not autowire,如果强行写(value  = false ),可能会报NullPointException异常 解决方案: dao层加注解@Component(value = "首字母小写的接口名如UserMapper->userMapper") dao层还可以加注解@Mapper 2.The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecogni

  • SpringBoot整合Mybatis的知识点汇总

    springboots使用的版本是2.0.1,注意不同版本可能有差异,并不一定通用 添加Mybatis的起步依赖: <!--mybatis起步依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version&

  • SpringBoot整合mybatis常见问题(小结)

    Spring中常见问题 1.NoSuchBeanDefinitionException 2.'..Service' that could not be found service找不到 3.port 80 was already in use 端口号被占用 4.TemplateInputException 模板解析异常或找不到模板 1.检查模板所在的目录是否与配置的前缀目录相同 2.检查返回的模板是否存在,返回值类型是否一致 3.检查配置前缀时是否以"/"斜杠结尾 4.控制层的url与

  • springboot整合netty-mqtt-client实现Mqtt消息的订阅和发布示例

    目录 1.添加依赖 2.源码 3.运行测试 1.添加依赖 <dependency> <groupId>org.jetlinks</groupId> <artifactId>netty-mqtt-client</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>junit</groupId

  • springboot整合netty框架的方式小结

    目录 方式一:注解@PostConstruct 方式二:利用监听器启动: 方式三 :利用ApplicationListener 上下文监听器 方式四:commiandLinerunner启动 netty作为一个高性能的io框架,是非好用的一个技术框架, Netty 是一个基于NIO的客户.服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户.服务端应用.Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务

  • springboot整合mybatis分页拦截器的问题小结

    简介 又到了吹水时间,是这样的,今天开发时想将自己写好的代码拿来优化,因为不想在开发服弄,怕搞坏了到时候GIT到生产服一大堆问题,然后把它分离到我轮子(工具)项目上,最后运行后发现我获取List的时候很卡至少10秒,我惊了平时也就我的正常版本是800ms左右(不要看它很久,因为数据量很大,也很正常.),前提是我也知道很慢,就等的确需要优化时,我在放出我优化的plus版本,回到10秒哪里,最开始我刚刚接到这个app项目时,在我用 PageHelper.startPage(page, num);(分

  • springBoot整合rabbitmq测试常用模型小结

    目录 1.添加依赖 2.编写配置 3.编写并测试 之前我们记录了原生java代码使用rabbitmq的方法,很简单,类似于原生jdbc代码一样,将连接对象抽离出来作为工具类,生产者和消费者通过工具类获取连接对象,进而获取通道对象,再注册交换机或者是队列等,发送消息与接收消息.在企业开发中,我们更多的是使用spring框架来整合其它技术,springboot更是方便的提供了各种starter来快速添加依赖,完成整合,开箱即用. 1.添加依赖 <dependency> <groupId>

随机推荐