全部开发者教程

RabbitMQ 入门教程

RabbitMQ 简介
RabbitMQ 简介

消息适配器应用实操

1. 前言

Hello,大家好。本小节会继续为同学们介绍 MessageListenerAdapter 消息适配器的相关使用。

在上一节中,我们介绍了 MessageListenerAdapter 消息适配器的基础概念和基础使用方法,这些是了解 MessageListenerAdapter 的前提,我们只有对这些基础知识了解之后,我们才能掌握 MessageListenerAdapter 消息适配器的基本使用。

话不多说,让我们直入正题吧。

本节主要内容:

  • MessageListenerAdapter 常用方法概述;

  • MessageListenerAdapter 基本使用流程。

2. MessageListenerAdapter 常用方法概述

我们在上一节中,对 MessageListenerAdapter 消息适配器的方法有了简单的了解,下面我来就看一下在 MessageListenerAdapter 中,都有哪些常用的方法吧。

方法名称:

setDefaultListenerMethod()

方法作用:

指定 MessageListenerAdapter 消息适配器中的默认的监听消息的方法的名称。

方法名称:

setMessageConverter()

方法作用:

指定 MessageListenerAdapter 消息适配器中对应消息监听方法的 Converter 方法参数转换器。

setDefaultListenerMethod 方法和 setMessageConverter 方法是 MessageListenerAdapter 消息适配器中常用的两个方法,也是使用频率比较高的两个方法,基本上只要使用 MessageListenerAdapter 消息适配器,就需要使用上述这两个方法。

在介绍完常用的两个方法之后,我们重点来看一下 MessageListenerAdapter 消息适配器的基本使用流程。

3. MessageListenerAdapter 基本使用流程

我们知道,在 RabbitMQ 中是存在生产者和消费者的,即生产者生产出来一条消息投放到 RabbitMQ 中,并最终被消费者所消费,在这一过程中,在生产者将消息投放到 RabbitMQ 中时,以及在消费者消费消息时,都可能要对消息进行监听处理。

我们的 MessageListenerAdapter 则是在生产者将消息投放到 RabbitMQ 中时进行监听, 而这个监听过程是有一定的监听步骤的,下面就让我们来看一下 MessageListenerAdapter 是如何监听消息被投放到 RabbitMQ 中的。

3.1 配置消息适配器基本骨架

在上节中,我们已经将使用 MessageListenerAdapter 消息适配器所需的依赖引入了进来,所以这里不再赘述,我们直接来看如何配置 MessageListenerAdapter 基本骨架。

配置 MessageListenerAdapter 基本骨架的代码如下所示:

MessageListenerAdapter adapter = new MessageListenerAdapter(new MessageAdapter());

container.setMessageListener(adapter);
return container;

代码解释:

第 1-2 行,是对 MessageListenerAdapter 进行初始化,上节已经介绍过,这里不再赘述。

第 4 行,我们将初始化好的 adapter 通过 container 的 setMessageListener 方法,设置到我们的 container 容器中,至于这里的 container 指的是什么,同学们可以回顾之前小节的内容,这里也不再介绍了。

第 5 行,我们将设置好的 container 容器进行返回。

通过上述代码段,我们就已经搭建好了使用 MessageListenerAdapter 消息适配器的基本骨架,剩下的就是在骨架中填充内容了。

3.2 填充消息适配器

在上述内容中,我们已经对常用的两个方法所有了解了,但是只是了解到这种程度是不够的,下面将会详细介绍这两个常用的方法,即我们会通过这两个常用的方法来填充 MessageListenerAdapter 消息适配器的骨架,使之具备处理相应业务逻辑的能力。

3.2.1 设置 MessageListenerAdapter 默认监听方法

无论我们使用哪种消息监听方式,都需要配置一个或多个对应的消息监听处理方法,使用 MessageListenerAdapter 消息适配器也是如此,只不过配置方法有些差别。

我们在配置消息监听处理方法时,MessageListenerAdapter 会要求我们自定义一个适配器的实现, 也就是上述代码段中的 new MessageAdapter() 中的 MessageAdapter 类,这个类就是我们自定义的适配器的实现,在该类中,我们可以声明我们的消息监听处理方法,而这个方法根据 MessageListenerAdapter 消息适配器,是需要我们设置默认方法名称的。

这个默认的方法名称就是 handleMessage , 这个在 RabbitMQ 官方文档,或者 MessageListenerAdapter 源码实现中都有提到,感兴趣的同学可以自行查阅。

handleMessage 这个名称是默认的消息监听处理方法的名称,但是在实际的工作中,我们更多的是需要自定义属于某一业务的具体的消息监听处理方法,例如 registerHandleMessage 等等,那这种情况我们又该如何设置呢?

这就需要用到我们的 setDefaultListenerMethod 方法了,如下代码所示:

代码实现:

MessageListenerAdapter adapter = new MessageListenerAdapter(new MessageAdapter());

adapter.setDefaultListenerMethod("registerHandleMessage");

container.setMessageListener(adapter);
return container;

代码解释:

配置 MessageListenerAdapter 骨架的代码就不介绍了,我们直接来看第 4 行代码。

第 4 行,我们使用 adapter 的 setDefaultListenerMethod 方法来将我们自定义的 registerHandleMessage 消息监听处理方法的方法名称进行设置,从而允许我们的 MessageListenerAdapter 消息适配器可以使用自定义的消息监听处理方法的方法名称。

3.2.2 设置 MessageListenerAdapter 自定义消息接收参数类型

我们都知道,RabbitMQ 中的消息是由消息参数和消息体所组成的,且消息的返回格式是 byte 类型的数组, 这就要求我们,如果想接收这一消息,所接收消息的方法中的参数类型一定要声明为 byte 数组类型才可以,但是在有些业务场景中,则是需要用字符串的方式去接收,这又该如何实现呢?

要实现这一需求,我们就需要使用 setMessageConverter 方法,来将 byte 数组类型的参数转换为我们所需要的消息参数类型,如下代码所示:

MessageListenerAdapter adapter = new MessageListenerAdapter(new MessageAdapter());

adapter.setMessageConverter(new StringMessageConverter());

container.setMessageListener(adapter);
return container;

代码解释:

配置 MessageListenerAdapter 骨架的代码不再赘述,我们直接来看第 4 行代码。

第 4 行,我们使用 adapter 的 setMessageListener 方法来将我们自定义的 StringMessageConverter 转换器传入到 MessageListenerAdapter 消息适配器中,来让 MessageListenerAdapter 消息适配器具备以字符串的方式来接收 RabbitMQ 中消息的能力。

对应的 StringMessageConverter 中的核心代码如下所示:

public class StringMessageConverter implements MessageConverter {
  @Override
  public Message toMessage(Object object, MessageProperties messageProperties) throws MessageConversionException {
    return new Message(object.toString().getBytes(), messageProperties);
  }

   @Override
  public Message fromMessage(Message message) throws MessageConversionException {
    // 一些逻辑处理
  }
}

代码解释:

第 1-2 行,我们声明了一个名为 StringMessageConverter 的类,并且实现了 MessageConverter 接口,重写了接口中对应的两个方法。

第 7 行,在 toMessage 方法中,我们对方法的返回值进行了处理,即该方法返回了一个 Message 实例,在这个 Message 实例的构造方法中,我们对接收消息的 object 参数进行了转换为字符串形式的处理,这样就使得MessageListenerAdapter 消息适配器具备了以字符串的方式来接收 RabbitMQ 中消息的能力。

至于其他的代码,不是我们本节所要考虑的内容,所以这里就不再介绍了,感兴趣的同学可以自行了解。

Tips: 1. MessageListenerAdapter 消息适配器的基本使用流程,就是配置出 MessageListenerAdapter 的基本骨架,然后根据实际的业务需求,来填充这个骨架的内容;
2. 我们只是介绍了两个常用的方法,在 MessageListenerAdapter 中还存在其他的方法,只不过使用的频率不是很高,如有需要同学们可自行了解。

4. 小结

本小节为同学们详细介绍了 MessageListenerAdapter 消息适配器的基本使用流程,包括如何配置 MessageListenerAdapter 消息适配器的基本骨架,如何填充 MessageListenerAdapter 消息适配器的骨架内容,从而满足实际的业务需要。旨在帮助各位同学可以对 MessageListenerAdapter 消息适配器的基本使用流程有一个简单的了解和思路,这样在实际的项目开发中才能用好 MessageListenerAdapter 消息适配器。