SpringBoot RabbitMQの統合利用

前提

前回の記事を書いた、「SpringBootカフカはの使用を統合生きるために使用される」読みの量が非常に高く、その使用の下に統合され、いくつかの他のMQとSpringBootについてかと思います。

ここでは4より人気MQは以下のとおりです。

両方のライトの後ろとSpringBoot記事を統合します。

RabbitMQのインストール

変更マックので、ので、これはドッカーで私に直接のRabbitMQ、内部インストールされているMacでの環境の一部が直接従事するが、彼らはRabbitMQのはあまりにも乱雑に従事するために、これらのコンピュータ・システムを所有してインストールしたいと思いますので、ドッカードッカーにインストールすることができますインストールインチ

Mac用ドッカーを起動し、見て、私の最後の記事にインストールされていない場合:HTTP://www.54tianzhisheng.cn / ...

もちろん、あなたはまた、独自のRabbitMQサーバまたは仮想マシンでLinuxのインストールを開始することができます。

RabbitMQの職員がそのドッカーコンテナを提供しているので、ドッキングウィンドウは、それは非常に簡単なインストール、唯一のコマンドは、完全なコードを:(表示するには、右にシフトすることができます)

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:私は管理者が設定したログインコンソール用のユーザー名を設定します。
  • RABBITMQDEFAULTPASS:コンソール用のパスワードを設定し、ここで私は管理者を設定します

:コンテナが正常に開始された後は、ブラウザのアドレス入力でき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 引入依赖后如下:

<?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> <groupId>com.zhisheng</groupId> <artifactId>rabbitmq</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>rabbitmq</name> <description>Demo project for Spring Boot RabbitMQ</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </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-amqp</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

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 整合使用

おすすめ

転載: www.cnblogs.com/springforall/p/11280130.html