RabbitTemplate 基础概念详解与配置
1. 前言
Hello,大家好。本小节会为同学们介绍 RabbitMQ 在 Spring 生态中的第二个核心组件,也就是 RabbitTemplate ,RabbitTemplate 作为 Spring 生态中的第二个核心组件,其在整个 RabbitMQ 中也扮演着重要的角色。
本小节首先会为各位同学介绍,什么是 RabbitTemplate ,即 RabbitTemplate 的基础概念,以及 RabbitTemplate 所发挥的作用,最后要给各位同学介绍 RabbitTemplate 的基本使用方法,即 RabbitTemplate 的基础配置。RabbitTemplate 的基础概念和基本使用都需我们同学有所了解和掌握。
本节主要内容:
- RabbitTemplate 基础概念概述;
- RabbitTemplate 基础配置概述。
2. RabbitTemplate 基础概念概述
基础概念:
在上一节中,我们接触了 RabbitMQ 在 Spring 生态中的第一个核心组件-RabbitAdmin ,了解了 RabbitAdmin 的基础概念和基本使用方法,知道了如何使用 RabbitAdmin 来配置客户端,也就是我们的应用程序连接 RabbitMQ Server 的配置方法,其实 RabbitAdmin 的主要目的就是与 RabbitMQ Server 建立连接,并声明 RabbitMQ 的核心元素。
在对 RabbitAdmin 有所了解之后,我们只是与 RabbitMQ Server 建立了一个可用的连接,并根据需求声明了 RabbitMQ 中的交换机、消息队列,以及绑定关系,此时,还并没有向 RabbitMQ Server 发送任何消息,我们的应用数据还不能被 RabbitMQ Server 处理,那么我们应该怎样在 Spring 中向 RabbitMQ Server 发送消息呢?
要想在 Spring 中向 RabbitMQ Server 发送消息,我们需要使用 RabbitTemplate 才行。 RabbitTemplate 是 Spring-AMQP 依赖为我们提供的一种 RabbitMQ 消息模板,它像 RabbitAdmin 一样,与 RabbitMQ Server 建立了一种映射关系,我们只需要使用 Java 代码来对 RabbitTemplate 进行配置,就可以将我们应用程序中的数据发送到 RabbitMQ Server 中。
RabbitTemplate 提供了编辑消息、发送消息、发送消息前的监听、发送消息后的监听等消息制造和消息监听功能,可以让我们像操作原生 RabbitMQ API 那样在 Spring 中通过 RabbitTemplate 来操作消息并发送和监听消息,这就是 RabbitTemplate 的作用之处。
我们可以通俗的来这样理解 RabbitTemplate ,对于 RabbitAdmin 而言,RabbitAdmin 是将应用程序和 RabbitMQ Server 建立链接的,而 RabbitTemplate 则是在建立连接之后,将我们应用程序中的数据发送到 RabbitMQ Server 中的。
在介绍完 RabbitTemplate 基础概念之后,下面让我们来看一下如何对 RabbitTemplate 进行配置吧。
3. RabbitTemplate 基础配置概述
对 RabbitTemplate 进行配置,和 RabbitAdmin 的配置步骤相似,都需要首先引入 Spring-AMQP 的依赖,就是我们上节中所述的如下两个依赖:
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 中发送消息之前,我们需要先对 RabbitTemplate 消息模板进行初始化,这个初始化过程非常简单,初始化 RabbitTemplate 消息模板的代码如下所示:
代码实现:
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
return rabbitTemplate;
}
代码解释:
第 1 行,我们使用 Spring 的 Bean 注解将我们声明的 rabbitTemplate 方法注入到 Spring 容器中,这样 Spring 容器就可以监听到我们注入的配置。
第 2 行,我们使用 Spring-AMQP 中的 RabbitTemplate 类,来声明了一个名为 rabbitTemplate 的方法,用来对 RabbitTemplate 消息模板进行初始化。
第 3 行,我们实例化了一个 rabbitTemplate 实例,该实例是 Spring-AMQP 中对 RabbitTemplate 消息模板进行初始化的实例,要想使用 RabbitTemplate 发送消息,就必须要初始化该实例。
第 4 行,我们将初始化好的 rabbitTemplate 实例进行返回。
Tips: 1. @Bean 注解是 Spring 容器中自带的注解,其作用就是将我们应用程序中的类,或者方法来注入到 Spring 容器中,作为 Spring 配置的一部分。
2. RabbitTemplate 实例接收我们所定义的 ConnectionFactory 连接,传入的连接名称应该和我们定义的 connectionFactory 名称保持一致,即与使用 Bean 注解来声明的连接名称保持一致,如果名称不保持一致,则 RabbitTemplate 就不会初始化,且会抛出异常。
RabbitTemplate 核心 API 介绍
下面我们来看一下在 RabbitTemplate 中,都有哪些核心的 API 。
MessageProperties 实例,用于对消息的 properties 参数进行描述;
Message 实例,用于对消息体进行描述;
send() 方法,用于将原始消息发送到 RabbitMQ Server 中;
convertAndSend() 方法,用于将原始消息进行转换,并且将转换过后的消息发送到 RabbitMQ Server 中;
addListener() 方法,用于为当前消息模板设置消息监听类型。
在介绍完常用核心 API 之后,接下来我们用一个发送消息的例子,来详细说明一下这下常用核心 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 参数,并分别 put 了两个不同的 header 。
第 6 行,我们初始化了一个 Message 消息实例 message ,并在构造方法中设置了消息体的内容为 Hello RabbitTemplate ,且将该消息的额外参数 messageProperties 也一并进行了设置。
第 7-14 行,我们使用 rabbitTemplate 的 convertAndSend 方法,将消息进行转换之后发送到了 RabbitMQ Server 中, 其中,convertAndSend 方法的第一个参数为要使用的交换机名称,这里是 test_direct_001 ,第二个参数为 routingKey ,这里是 test.123 ,第三个参数是我们需要发送的消息 message ,第四个参数则是消息发送成功后的监听器。
对于这个监听器,这里采用了 new MessagePostProcessor 的匿名内部类的形式进行实现,要添加 MessagePostProcessor 消息监听器,需要重写 postProcessMessage 方法,即消息发送成功后的方法,在该方法中,我们可以对消息发送成功后进行进一步的设置,最后将设置好的 Message 进行返回。
关于 send 方法和 addListener 方法,如下代码所示:
rabbitTemplate.send("test\_direct\_001", "test.123", message);
// 省略对 channel 的配置
rabbitTemplate.addListener(channel);
代码解释:
第 1 行,我们使用 rabbitTemplate 的 send 方法向 RabbitMQ Server 中发送了一条消息,其中,send 方法的第一个参数为绑定的交换机,这里是 test_direct_001 ,第二个参数为 routingKey ,这里是 test.123,第三个参数为我们要发送的消息 message 。
第 3 行,我们使用 rabbitTemplate 的 addListener 方法,为当前的消息模板添加了消息监听器,addListener 方法需要传递一个 channel ,这个channel 需要我们事先配置好,就像介绍 Channel 小节那样。
Tips: 1. send 方法和 convertAndSend 方法,区别之处在于,前者不会对消息进行转换,我们传递进去的是什么消息,就会往 RabbitMQ Server 中发送什么消息;后者则会将我们传递进去的消息进行转换,具体如何转换的需要我们观察源码之后才会清楚,并将转换过后的消息发送到 RabbitMQ Server中;
2. addListener 方法在 RabbitTemplate 中并不是使用频率最高的,但确是经常使用的一种消息监听的添加方法,如果我们不能在 convertAndSend 方法中添加消息监听,才会考虑使用 addListener 方法。
4. 小结
本小节为同学们介绍了在 Spring 生态中的 RabbitTemplate 消息模板。RabbitTemplate 作为 Spring-AMQP 中的消息模板,其发挥着重要的作用,RabbitTemplate 消息模板是连接应用程序和 RabbitMQ Server 中间的桥梁,如果我们只配置了 RabbitAdmin ,没有配置 RabbitTemplate ,那么我们的消息就无法发送到 RabbitMQ Server 中,也就没法实现业务的闭环。
本小节详细介绍了 RabbitTemplate 的基础概念和作用,以及 RabbitTemplate 的基础常用核心 API ,以及基础配置的配置方法,对于这其中容易出现问题的地方也做了提示,旨在帮助同学们可以对 RabbitTemplate 有一个基础的了解,并且要会使用 RabbitTemplate 进行基本的消息发送和消息监听处理。