1. 程式人生 > 程式設計 >SpringBoot中使用 RabbitMQ的教程詳解

SpringBoot中使用 RabbitMQ的教程詳解

本章主要建立在已經安裝好Erlang以及RabbitMQ的基礎上,接下來,簡單介紹一下使用

一、Direct直接模式

通過routingKey和exchange決定的那個唯一的queue可以接收訊息

在這裡插入圖片描述

1、首先到RabbitMQ的管理介面新建一個佇列(Direct模式)

在這裡插入圖片描述

2、測試專案的基礎結構如下:

這裡為了方便測試,直接在父專案中建立兩個子模組(生產者和消費者)

在這裡插入圖片描述

3、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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <packaging>pom</packaging>
 <modules>
  <module>rab-consumer</module>
  <module>rab-producer</module>
 </modules>
 <parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.0.7.RELEASE</version>
  <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <groupId>interview</groupId>
 <artifactId>rabbitmq-interview</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <name>rabbitmq-interview</name>
 <description>Demo rabbitmq project for Spring Boot</description>

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

 <dependencies>
  <!--1、amqp高階訊息佇列的依賴-->
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-amqp</artifactId>
  </dependency>
		<!--2、測試的依賴-->
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
  </dependency>
  <dependency>
   <groupId>org.springframework.amqp</groupId>
   <artifactId>spring-rabbit-test</artifactId>
   <scope>test</scope>
  </dependency>
 </dependencies>

 <build>
  <plugins>
   <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
   </plugin>
  </plugins>
 </build>

</project>

4、準備傳送的資料

回到IDEA中,開啟子模組的生產者模組,我這邊是rab_producer,在resource下建立springboot的配置檔案:application.yml檔案,內容如下:

spring:
 rabbitmq:
 host: localhost
# host 為RabbitMQ主機的地址

之後新建一個SpringBoot的啟動類:

@SpringBootApplication
public class RabbitMQApplication {
 public static void main(String[] args) {
  SpringApplication.run(RabbitMQApplication.class);
 }
}

然後新建測試類:

@RunWith(SpringRunner.class) // 固定寫法
@SpringBootTest(classes = RabbitMQApplication.class) // SpringBoot啟動類(自定義的)
public class RabTest {
 @Autowired
 private RabbitTemplate rabbitTemplate; // 注入一個RabbitMQ的模板物件,操作訊息佇列的物件

 // 傳送一條點對點(Direct)的訊息,又稱為直連
 @Test
 public void sendQueue(){
  System.out.println("開始向佇列中傳送一條訊息!");
  // 引數1:管理中的佇列名 引數2:傳送的訊息
  rabbitTemplate.convertAndSend("weiku","message:這是一條訊息!");
  System.out.println("訊息傳送完畢!");
 }
}

執行測試方法即可把訊息傳送到佇列(weiku)中。

如果訊息未被消費,可在管理介面檢視到:

在這裡插入圖片描述

3、準備消費者接收訊息

回到IDEA中,開啟子模組的消費者模組,我這邊是rab_consumer,在子模組中建立一個啟動類,內容如下:

在這裡插入圖片描述

@SpringBootApplication
public class RabbitMQApplication {
 public static void main(String[] args) {
  SpringApplication.run(RabbitMQApplication.class);
 }
}

完成之後,定義一個接收訊息的監聽器,並且注入到Spring容器中,程式碼如下:

@Component // 需要注入到Spring容器中
@RabbitListener(queues = "weiku") // 指定監聽的佇列名
public class Consumer1 {
 @RabbitHandler // 訊息接收處理
 public void showMSG(String message){ // 得到我們producer中傳送的Object資料,此處可根據傳過來的型別來選擇接收,否則丟擲異常
  System.out.println("weiku收到的訊息內容為:" + message);
 }
}

準備完成之後,執行啟動類可接收到我們剛剛傳送的Direct點對點的訊息,這種模式的訊息只能被一個消費者所消費到,執行結果如下:

在這裡插入圖片描述

二、fanout廣播模式

在這裡插入圖片描述

首先需要到RabbitMQ的管理介面新增一個路由交換機(Exchange)

在這裡插入圖片描述

新建完路由之後,需要再新建幾個佇列,如圖:

在這裡插入圖片描述

之後,還沒完,需要把我們新建路由和我們新建的佇列繫結:

在這裡插入圖片描述

出現如圖介面:

在這裡插入圖片描述

繫結完成之後,開始程式碼測試。

5、進行 釋出/訂閱 的程式碼測試

生產者:

// 廣播的形式傳送,同一個路由下的所有佇列都能接收到訊息
@Test
public void sendFanout(){
 System.out.println("開始向路由傳送訊息(路由下的所有Queue都能收到該訊息)");
 // 引數1:路由名 引數2:可有可無 引數3:傳送的訊息內容
 rabbitTemplate.convertAndSend("weiku-work","","這是一條所有消費者都能收到的訊息!");
 System.out.println("訊息傳送成功!");
}

消費者:

消費者1:

@Component // 需要注入到Spring容器中
@RabbitListener(queues = "weiku") // 指定監聽的佇列名
public class Consumer1 {
 @RabbitHandler // 訊息接收處理
 public void showMSG(String message){ // 得到我們producer中傳送的Object資料,此處可根據傳過來的型別來選擇接收,否則丟擲異常
  System.out.println("weiku收到的訊息內容為:" + message);
 }
}

消費者2:

@Component // 需要注入到Spring容器中
@RabbitListener(queues = "weiku1") // 指定監聽的佇列名
public class Consumer2 {
 @RabbitHandler // 訊息接收處理
 public void getMSG(String msg){
  System.out.println("weiku1收到的訊息如下:" + msg);
 }
}

消費者3:

@Component // 需要注入到Spring容器中
@RabbitListener(queues = "weiku2") // 指定監聽的佇列名
public class Consumer3 {
 @RabbitHandler // 訊息接收處理
 public void getMSG(String msg){
  System.out.println("weiku2收到的訊息如下:" + msg);
 }
}

先執行生產者的測試傳送訊息的方法,再執行消費者的SpringBoot啟動類。

執行結果如下:

在這裡插入圖片描述

三、Topic萬用字元模式

topic主題模式模糊匹配,不是精確匹配。

在這裡插入圖片描述

新建一個用來發送主題的路由

在這裡插入圖片描述

路由新建完之後,新建3個佇列,用來接收發布的 topic,如圖:

在這裡插入圖片描述

之後還需把我們新建的佇列和路由進行繫結,如圖所示:

在這裡插入圖片描述

這裡的 # 代表所有型別匹配。

以上的準備完成之後,開始程式碼測試:

測試1:

生產者:

@Test
public void sendTopic1(){
 System.out.println("開始向路由中傳送訊息!引數2:routingKey");
 // 引數1:路由器名 引數2:類似於傳送的規則名
 rabbitTemplate.convertAndSend("weiku-topic","good.log","這是一條good.log訊息");
}

此處三個佇列都能接收到資料,因為都匹配。

消費者:

消費者1:

@Component
@RabbitListener(queues = "wk0")
public class Con1 {
 @RabbitHandler
 public void getMSG(String msg){
  System.out.println("wk0收到的訊息為:" + msg);
 }
}

消費者2:

@Component
@RabbitListener(queues = "wk1")
public class Con2 {
 @RabbitHandler
 public void getMSG(String msg){
  System.out.println("wk1收到的訊息如下:" + msg);
 }
}

消費者3:

@Component
@RabbitListener(queues = "wk2")
public class Con3 {
 @RabbitHandler
 public void getMSG(String msg){
  System.out.println("wk2收到的訊息如下:" + msg);
 }

 /**
  * 可以進行過載,會找到指定引數的queue上
  * @param map
  */
 @RabbitHandler
 public void getMSG(Map map){
  System.out.println("wk2收到的(map)訊息如下:" + map);
 }
 @RabbitHandler
 public void getMSG(List list){
  System.out.println("wk2收到的(list)訊息如下:" + list);
 }
}

啟動SpringBoot,執行結果如下:

在這裡插入圖片描述
在這裡插入圖片描述

因為這邊3個佇列都符合了規則,所以都能消費到訊息

測試2:

生產者:

@Test
public void sendTopic2(){
 System.out.println("開始向路由中傳送訊息!引數2:routingKey");
 rabbitTemplate.convertAndSend("weiku-topic","維護.log","這是一條 維護.log訊息");
 rabbitTemplate.convertAndSend("weiku-topic","日誌.log","這是一條 日誌.log訊息");
}

消費者執行結果:

在這裡插入圖片描述
在這裡插入圖片描述

此處只有 wk1 能接收到訊息,因為 wk1 符合以 . log 結尾

測試3:

生產者:

@Test
public void sendTopic3(){
 // 1.準備傳送的資料
 Map map = new HashMap();
 map.put(1,"a");
 map.put(2,"b");
 List list = new ArrayList();
 list.add("qq");
 list.add("ww");
 list.add("SS");
 System.out.println("開始向路由中傳送訊息!引數2為routingKey");
 // 2.開始傳送訊息(傳送了2條)
 // 2.1 傳送的資料為map型別
 rabbitTemplate.convertAndSend("weiku-topic","good.txt",map);
 // 2.2 傳送的資料為list型別
 rabbitTemplate.convertAndSend("weiku-topic",list);
}

消費者執行效果如下:

在這裡插入圖片描述

在這裡插入圖片描述

此處只有 wk2 能夠收到訊息,且被指定型別的監聽器所消費。

至此,我們的測試就結束了。

到此這篇關於SpringBoot中使用 RabbitMQ的教程詳解的文章就介紹到這了,更多相關SpringBoot使用 RabbitMQ內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!