RabbitTemplate 基礎概念詳解與配置
1. 前言
Hello,大家好。本小節(jié)會為同學們介紹 RabbitMQ 在 Spring 生態(tài)中的第二個核心組件,也就是 RabbitTemplate ,RabbitTemplate 作為 Spring 生態(tài)中的第二個核心組件,其在整個 RabbitMQ 中也扮演著重要的角色。
本小節(jié)首先會為各位同學介紹,什么是 RabbitTemplate ,即 RabbitTemplate 的基礎概念,以及 RabbitTemplate 所發(fā)揮的作用,最后要給各位同學介紹 RabbitTemplate 的基本使用方法,即 RabbitTemplate 的基礎配置。RabbitTemplate 的基礎概念和基本使用都需我們同學有所了解和掌握。
本節(jié)主要內容:
-
RabbitTemplate 基礎概念概述;
-
RabbitTemplate 基礎配置概述。
2. RabbitTemplate 基礎概念概述
基礎概念:
在上一節(jié)中,我們接觸了 RabbitMQ 在 Spring 生態(tài)中的第一個核心組件-RabbitAdmin ,了解了 RabbitAdmin 的基礎概念和基本使用方法,知道了如何使用 RabbitAdmin 來配置客戶端,也就是我們的應用程序連接 RabbitMQ Server 的配置方法,其實 RabbitAdmin 的主要目的就是與 RabbitMQ Server 建立連接,并聲明 RabbitMQ 的核心元素。
在對 RabbitAdmin 有所了解之后,我們只是與 RabbitMQ Server 建立了一個可用的連接,并根據(jù)需求聲明了 RabbitMQ 中的交換機、消息隊列,以及綁定關系,此時,還并沒有向 RabbitMQ Server 發(fā)送任何消息,我們的應用數(shù)據(jù)還不能被 RabbitMQ Server 處理,那么我們應該怎樣在 Spring 中向 RabbitMQ Server 發(fā)送消息呢?
要想在 Spring 中向 RabbitMQ Server 發(fā)送消息,我們需要使用 RabbitTemplate 才行。 RabbitTemplate 是 Spring-AMQP 依賴為我們提供的一種 RabbitMQ 消息模板,它像 RabbitAdmin 一樣,與 RabbitMQ Server 建立了一種映射關系,我們只需要使用 Java 代碼來對 RabbitTemplate 進行配置,就可以將我們應用程序中的數(shù)據(jù)發(fā)送到 RabbitMQ Server 中。
RabbitTemplate 提供了編輯消息、發(fā)送消息、發(fā)送消息前的監(jiān)聽、發(fā)送消息后的監(jiān)聽等消息制造和消息監(jiān)聽功能,可以讓我們像操作原生 RabbitMQ API 那樣在 Spring 中通過 RabbitTemplate 來操作消息并發(fā)送和監(jiān)聽消息,這就是 RabbitTemplate 的作用之處。
我們可以通俗的來這樣理解 RabbitTemplate ,對于 RabbitAdmin 而言,RabbitAdmin 是將應用程序和 RabbitMQ Server 建立鏈接的,而 RabbitTemplate 則是在建立連接之后,將我們應用程序中的數(shù)據(jù)發(fā)送到 RabbitMQ Server 中的。
在介紹完 RabbitTemplate 基礎概念之后,下面讓我們來看一下如何對 RabbitTemplate 進行配置吧。
3. RabbitTemplate 基礎配置概述
對 RabbitTemplate 進行配置,和 RabbitAdmin 的配置步驟相似,都需要首先引入 Spring-AMQP 的依賴,就是我們上節(jié)中所述的如下兩個依賴:
3.1 引入 RabbitTemplate
以 Maven 引入方式為例,引入代碼如下所示:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.5</version>
</dependency>
和 RabbitAdmin 相同,在將這兩個依賴進行引入之后,我們就可以對 RabbitTemplate 進行配置了。
3.2 RabbitTemplate 基礎配置
初始化 RabbitTemplate 消息模板
在使用 RabbitTemplate 消息模板來往 RabbitMQ Server 中發(fā)送消息之前,我們需要先對 RabbitTemplate 消息模板進行初始化,這個初始化過程非常簡單,初始化 RabbitTemplate 消息模板的代碼如下所示:
代碼實現(xiàn):
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
return rabbitTemplate;
}
代碼解釋:
第 1 行,我們使用 Spring 的 Bean 注解將我們聲明的 rabbitTemplate 方法注入到 Spring 容器中,這樣 Spring 容器就可以監(jiān)聽到我們注入的配置。
第 2 行,我們使用 Spring-AMQP 中的 RabbitTemplate 類,來聲明了一個名為 rabbitTemplate 的方法,用來對 RabbitTemplate 消息模板進行初始化。
第 3 行,我們實例化了一個 rabbitTemplate 實例,該實例是 Spring-AMQP 中對 RabbitTemplate 消息模板進行初始化的實例,要想使用 RabbitTemplate 發(fā)送消息,就必須要初始化該實例。
第 4 行,我們將初始化好的 rabbitTemplate 實例進行返回。
Tips: 1. @Bean 注解是 Spring 容器中自帶的注解,其作用就是將我們應用程序中的類,或者方法來注入到 Spring 容器中,作為 Spring 配置的一部分。
2. RabbitTemplate 實例接收我們所定義的 ConnectionFactory 連接,傳入的連接名稱應該和我們定義的 connectionFactory 名稱保持一致,即與使用 Bean 注解來聲明的連接名稱保持一致,如果名稱不保持一致,則 RabbitTemplate 就不會初始化,且會拋出異常。
RabbitTemplate 核心 API 介紹
下面我們來看一下在 RabbitTemplate 中,都有哪些核心的 API 。
MessageProperties 實例,用于對消息的 properties 參數(shù)進行描述;
Message 實例,用于對消息體進行描述;
send() 方法,用于將原始消息發(fā)送到 RabbitMQ Server 中;
convertAndSend() 方法,用于將原始消息進行轉換,并且將轉換過后的消息發(fā)送到 RabbitMQ Server 中;
addListener() 方法,用于為當前消息模板設置消息監(jiān)聽類型。
在介紹完常用核心 API 之后,接下來我們用一個發(fā)送消息的例子,來詳細說明一下這下常用核心 API ,如下代碼所示:
@Autowired
private RabbitTemplate rabbitTemplate;
MessageProperties messageProperties = new MessageProperties();
messageProperties.getHeaders().put("test1", "test1");
messageProperties.getHeaders().put("test2", "test2");
Message message = new Message("Hello RabbitTemplate".getBytes(), messageProperties);
rabbitTemplate.convertAndSend("test_direct_001", "test.123", message, new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().getHeaders().put("test1", "test111");
message.getMessageProperties().getHeaders().put("test2", "test222");
return message;
}
});
代碼解釋:
第 1-2 行,我們使用 Autowired 注解,來將 RabbitTemplate 注入進來,并用一個私有變量 rabbitTemplate 來接收。
第 3 行,我們實例化了一個 MessageProperties 的實例 messageProperties 。
第 4-5 行,我們使用 messageProperties 實例的 getHeaders 方法獲取到消息的 headers 參數(shù),并分別 put 了兩個不同的 header 。
第 6 行,我們初始化了一個 Message 消息實例 message ,并在構造方法中設置了消息體的內容為 Hello RabbitTemplate ,且將該消息的額外參數(shù) messageProperties 也一并進行了設置。
第 7-14 行,我們使用 rabbitTemplate 的 convertAndSend 方法,將消息進行轉換之后發(fā)送到了 RabbitMQ Server 中, 其中,convertAndSend 方法的第一個參數(shù)為要使用的交換機名稱,這里是 test_direct_001 ,第二個參數(shù)為 routingKey ,這里是 test.123 ,第三個參數(shù)是我們需要發(fā)送的消息 message ,第四個參數(shù)則是消息發(fā)送成功后的監(jiān)聽器。
對于這個監(jiān)聽器,這里采用了 new MessagePostProcessor 的匿名內部類的形式進行實現(xiàn),要添加 MessagePostProcessor 消息監(jiān)聽器,需要重寫 postProcessMessage 方法,即消息發(fā)送成功后的方法,在該方法中,我們可以對消息發(fā)送成功后進行進一步的設置,最后將設置好的 Message 進行返回。
關于 send 方法和 addListener 方法,如下代碼所示:
rabbitTemplate.send("test_direct_001", "test.123", message);
// 省略對 channel 的配置
rabbitTemplate.addListener(channel);
代碼解釋:
第 1 行,我們使用 rabbitTemplate 的 send 方法向 RabbitMQ Server 中發(fā)送了一條消息,其中,send 方法的第一個參數(shù)為綁定的交換機,這里是 test_direct_001 ,第二個參數(shù)為 routingKey ,這里是 test.123,第三個參數(shù)為我們要發(fā)送的消息 message 。
第 3 行,我們使用 rabbitTemplate 的 addListener 方法,為當前的消息模板添加了消息監(jiān)聽器,addListener 方法需要傳遞一個 channel ,這個channel 需要我們事先配置好,就像介紹 Channel 小節(jié)那樣。
Tips: 1. send 方法和 convertAndSend 方法,區(qū)別之處在于,前者不會對消息進行轉換,我們傳遞進去的是什么消息,就會往 RabbitMQ Server 中發(fā)送什么消息;后者則會將我們傳遞進去的消息進行轉換,具體如何轉換的需要我們觀察源碼之后才會清楚,并將轉換過后的消息發(fā)送到 RabbitMQ Server中;
2. addListener 方法在 RabbitTemplate 中并不是使用頻率最高的,但確是經(jīng)常使用的一種消息監(jiān)聽的添加方法,如果我們不能在 convertAndSend 方法中添加消息監(jiān)聽,才會考慮使用 addListener 方法。
4. 小結

本小節(jié)為同學們介紹了在 Spring 生態(tài)中的 RabbitTemplate 消息模板。RabbitTemplate 作為 Spring-AMQP 中的消息模板,其發(fā)揮著重要的作用,RabbitTemplate 消息模板是連接應用程序和 RabbitMQ Server 中間的橋梁,如果我們只配置了 RabbitAdmin ,沒有配置 RabbitTemplate ,那么我們的消息就無法發(fā)送到 RabbitMQ Server 中,也就沒法實現(xiàn)業(yè)務的閉環(huán)。
本小節(jié)詳細介紹了 RabbitTemplate 的基礎概念和作用,以及 RabbitTemplate 的基礎常用核心 API ,以及基礎配置的配置方法,對于這其中容易出現(xiàn)問題的地方也做了提示,旨在幫助同學們可以對 RabbitTemplate 有一個基礎的了解,并且要會使用 RabbitTemplate 進行基本的消息發(fā)送和消息監(jiān)聽處理。