摘要:可以在地址看到如何使用讲解下上面命令行表示控制台端口号,可以在浏览器中通过控制台来执行的相关操作。同时从控制台可以看到发送的速率多线程测试性能开了个线程,每个线程发送条消息。
前提
上次写了篇文章,《SpringBoot Kafka 整合使用》,阅读量还挺高的,于是想想还是把其他几种 MQ 也和 SpringBoot 整合使用下。
下面是四种比较流行的 MQ :
后面都写写和 SpringBoot 整合的文章。
安装 RabbitMQ由于换 Mac 了,所以一些环境就直接在 Mac 搞,但是像安装 RabbitMQ 这些又会把自己电脑系统给搞的太乱,所以能在 Docker 里面安装就安装在 Docker,这次 RabbitMQ 我也直接在 Docker 里安装。
启动 Docker for Mac,如果没安装过的请看我上一篇文章:http://www.54tianzhisheng.cn/...
当然你也可以在自己的 Linux 服务器或者虚拟机里启动安装 RabbitMQ 。
Docker 安装的话很简单,因为 RabbitMQ 官方已经提供了自己的 Docker 容器,只需要一行命令:(可右移查看完整代码)
docker run -d -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --name rabbitmq rabbitmq:3-management
该镜像拥有一个基于 web 的控制台和 Http API。Http API 可以在地址看到如何使用:http://localhost:15672/api/
讲解下上面命令行:
15672 :表示 RabbitMQ 控制台端口号,可以在浏览器中通过控制台来执行 RabbitMQ 的相关操作。
5672 : 表示 RabbitMQ 所监听的 TCP 端口号,应用程序可通过该端口与 RabbitMQ 建立 TCP 连接,并完成后续的异步消息通信
RABBITMQDEFAULTUSER:用于设置登陆控制台的用户名,这里我设置 admin
RABBITMQDEFAULTPASS:用于设置登陆控制台的密码,这里我设置 admin
容器启动成功后,可以在浏览器输入地址:http://localhost:15672/ 访问控制台
登陆后:
简单描述下上图中中控制台的列表的作用:
Overview :用于查看 RabbitMQ 的一些基本信息(消息队列、消息发送速率、节点、端口和上下文信息等)
Connections:用于查看 RabbitMQ 客户端的连接信息
Channels:用户查看 RabbitMQ 的通道信息
Exchange:用于查看 RabbitMQ 交换机
Queues:用于查看 RabbitMQ 的队列
Admin:用于管理用户,可增加用户
创建项目在 IDEA 中创建一个 SpringBoot 项目结构:
SpringBoot 框架中已经内置了对 RabbitMQ 的支持,如果你看过官方文档的话,就可以看到的,我们需要把依赖 spring-boot-starter-amqp 引入就行。
1、 pom.xml 引入依赖后如下:
4.0.0 com.zhisheng rabbitmq 0.0.1-SNAPSHOT jar rabbitmq Demo project for Spring Boot RabbitMQ org.springframework.boot spring-boot-starter-parent 1.5.9.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-amqp org.springframework.boot spring-boot-maven-plugin
2、application.properties 配置修改如下:
spring.rabbitmq.addresses=localhost:5672 spring.rabbitmq.username=admin spring.rabbitmq.password=admin
3、消息发送类 RabbitMQClient.java
package com.zhisheng.rabbitmq.client; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * Created by zhisheng_tian on 2018/1/23 */ @Componentpublic class RabbitMQClient { @Autowired private RabbitTemplate rabbitTemplate; public void send(String message) { rabbitTemplate.convertAndSend("zhisheng", message); } }
就这样,发送消息代码就实现了。
这里关键的代码为 rabbitTemplate.convertAndSend() 方法, zhisheng 这个是路由规则(routingKey),它的值表明将消息发送到指定的队列 zhisheng 中去,这里跟了下源码,发现 convertAndSend() 方法最后调用的方法其实是一个 doSend() 方法。
4、消息接收类
package com.zhisheng.rabbitmq.server; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; /** * Created by zhisheng_tian on 2018/1/23 */ @Componentpublic class RabbitMQServer { @RabbitListener(queues = "zhisheng") public void receive(String message) { System.out.println("收到的 message 是:" + message); } }
你看,这里就有个 RabbitListener 一直在监听着队列 zhisheng 。
当然这个队列是必须要我们自己在应用程序中创建好,它不会像我之前写的文章 《SpringBoot Kafka 整合使用》 中的 Kafka 一样,Kafka 它会在用到队列的时候动态的创建,不需要我们提前创建好。
那么在 RabbitMQ 中该如何创建队列呢?
如上图所示:这样我们就创建好了一个 zhisheng 的队列,当程序开始运行时,消息接收类会持续监听队列 zhisheng 中即将到来的消息。
5、运行项目
需要在启动类中注入发送消息的类,并且提供 init 方法,在 init 方法中调用发送消息类的 send() 方法
@PostConstructpublic void init() { rabbitMQClient.send("发送消息----zhisheng-----"); }
需要注意的是:init() 方法带有 @PostConstruct 注解,被 @PostConstruct 修饰的方法会在构造函数之后执行。
启动项目就可以发现控制台已经接收到消息了。
6、单线程测试性能
看到上面图片中注释掉的代码没?那就是用来测试消息发送的性能的,我发送 10000 条消息看看总共耗时多少。
10000 条消息发送耗时:215ms。这是在单线程下,下次可以和其他的 MQ 测试对比下,并且也可以在多线程的环境下测试性能。
同时从控制台可以看到发送的速率:
7、多线程测试性能
开了10 个线程,每个线程发送 10000 条消息。
init 方法代码如下:
@PostConstruct public void init() { StopWatch stopWatch = new StopWatch(); stopWatch.start(); int threads = 10; ExecutorService executorService = Executors.newFixedThreadPool(threads); final CountDownLatch start = new CountDownLatch(1); final CountDownLatch end = new CountDownLatch(threads); for (int i = 0; i < threads; i++) { executorService.execute(( ) -> { try { start.await(); for (int i1 = 0; i1 < 10000; i1++) { rabbitMQClient.send("发送消息----zhisheng-----"); } } catch (InterruptedException e) { e.printStackTrace(); } finally { end.countDown(); } } ); } start.countDown(); try { end.await(); } catch (InterruptedException e) { e.printStackTrace(); } finally { executorService.shutdown(); } stopWatch.stop(); System.out.println("发送消息耗时:" + stopWatch.getTotalTimeMillis()); }
耗时:4063ms
控制台显示如下图:
8、注意
这里测试发送的消息直接是 String 类型的,你也可以测试下 Bean 类,这需要注意需要序列化。
推荐阅读:
《深入理解 Java 内存模型》读书笔记
面试-基础篇
Spring Boot 2.0 迁移指南
SpringBoot使用Docker快速部署项目
为什么选择 Spring 作为 Java 框架?
SpringBoot RocketMQ 整合使用和监控
Spring Boot 面试的十个问题
使用 Spring Framework 时常犯的十大错误
SpringBoot Admin 使用指南
上篇好文:
SpringBoot Kafka 整合使用
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75715.html
摘要:创建消息监听,并发送一条消息在程序中,提供了发送消息和接收消息的所有方法。 这篇文章带你了解怎么整合RabbitMQ服务器,并且通过它怎么去发送和接收消息。我将构建一个springboot工程,通过RabbitTemplate去通过MessageListenerAdapter去订阅一个POJO类型的消息。 准备工作 15min IDEA maven 3.0 在开始构建项目之前,机器需...
摘要:介绍它是出品,最流行的,能力强劲的开源消息总线。是一个完全支持和规范的实现,尽管规范出台已经是很久的事情了,但是在当今的应用中间仍然扮演着特殊的地位。相关文章整合使用整合使用关注我转载请务必注明原创地址为安装同之前一样,直接在里面玩吧。 showImg(https://segmentfault.com/img/remote/1460000012996066?w=1920&h=1281)...
阅读 2313·2021-11-08 13:13
阅读 1244·2021-10-09 09:41
阅读 1682·2021-09-02 15:40
阅读 3185·2021-08-17 10:13
阅读 2545·2019-08-29 16:33
阅读 3121·2019-08-29 13:17
阅读 3130·2019-08-29 11:00
阅读 3294·2019-08-26 13:40