SpringBoot整合RabbitMQ

2,120 阅读4分钟

这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战

1. RabbitMQ是什么

1.1 AMQP

认识RabbitMQ之前,先了解一下AMQP是什么。AMQP,Advanced Message Queuing Protocol,即高级消息队列协议,这是一种使用独立语言开发、应用广泛的消息协议,其定义了一种二级制格式的消息流。

基于AMQP协议的客户端可以与中间服务传递消息,任何语言都可以实现该协议并与中间服务通信。

1.2 RabbitMQ

RabbitMQ是一款使用Erlang语言开发的,基于AMQP协议的消息中间件,作为一款优秀的消息系统,RabbitMQ有高并发、可扩展等优势,并适用于大型系统中各个模块之间的通信。

RabbitMQ的特点为:

  • 持久化、传输确认、发布确认等功能保证消息可靠
  • 支持多种消息分发模式,处理更加灵活
  • 提供可视化管理界面,使用方便
  • 支持集群部署,保证服务高可用

2. RabbitMQ安装

rabbitmq作为第三方消息队列框架,使用时需要独立安装服务,详细安装流程可以查看相关教程。

  1. 安装erlang服务
  2. 安装rabbitmq,如果是3.9.10及以上版本会自动安装erlang依赖项,可跳过步骤1
  3. 安装完成启动rabbitmq服务,并使用账户登录后台服务

3. 项目中整合RabbitMQ

SpringBoot引入RabbitMQ官方文档

3.1 引入依赖信息

Spring Boot中已经对AMQP进行了封装,使用时只需要在项目依赖中引入spring-boot-starter-amqp的启动依赖信息即可。

<!--rabbitmq依赖信息-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

3.2 编辑配置信息

3.2.1 配置文件

引入rabbitmq依赖信息后,还需要在项目的配置文件中设置rabbitmq服务的地址、端口号以及连接服务的账户信息。

# ① rabbitmq配置
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

# ② 直接使用address属性配置
spring.rabbitmq.addresses=amqp://guest:guest@localhost:5672
  • 两种方式效果是相同的,可以选择其中一种进行配置
  • 第二种方式中,主机地址和端口号为默认localhost:5672时可以省略
  • 生产和消费方都要使用配置,注意默认连接端口号是5672,而不是管理页面的15672

3.2.2 Exchange和Queue配置

使用rabbitmq时,需要先创建Queue作为消息的载体,用来存放生产者产生数据,并供给消费者处理,可以通过管理界面或代码中配置两种方式创建。

  1. 管理界面配置 rabbitmq服务启动后,使用账户登录管理页面,可以在其中管理rabbitmq中的相关容器组件。

rabbitmq中默认存在7种Exchange,可以在Exchanges标签页内手动添加自定义Exchange。

image.png

切换至Queues标签页,可以增加Queue。

image.png

对于Exchange和Queue,可以在Exchanges标签页种,点击具体的Exchange名称,使用Routing Key绑定Queue。

image.png

绑定完成后,在项目种可以使用Roting Key、Queue名称来指定发送和接收消息内容。

  1. 项目中声明配置 管理界面属于可视化操作,容易存在人为操作的遗漏问题。可以在代码配置种显示声明Exchange和Queue信息,使用时不存在则自动创建容器。
@Configuration
public class RabbitMQConfig {
    /**
     * 自定义消息队列
     * @return
     */
    @Bean
    public Queue rabbitmqQueue(){
        return new Queue("queue",true,false,false);
    }

    /**
     * 自定义交换机
     * @return
     */
    @Bean
    public DirectExchange rabbitmqDirectExchange(){
        return new DirectExchange("directExchange",true,false);
    }

    /**
     * 关联绑定
     * @return
     */
    @Bean
    public Binding bindDirect(){
        return BindingBuilder.bind(rabbitmqQueue()).to(rabbitmqDirectExchange()).with("routingKey");
    }
}
  • 声明队列时使用的是org.springframework.amqp.core.Queue包中的Queue
  • 声明容器对象并加入Spring容器,启动时便会在rabbitmq服务中自动创建
  • 创建队列和交换机时,传入的参数代表意义为:
    • durable,默认false,消息是否持久化,即在无消费者消费时数据存储在内存还是磁盘中
    • exclusive,默认false,容i是否只能被当前创建的连接使用,并且关闭后自动删除
    • autoDelete,是否自动删除,为true时,当容器不再使用则会自动删除

3.3 生产者产生数据

生产者作为消息的生产方,主要功能就是将数据发送到消息队列中,发送时要指定具体发送的队列名称。

  1. 需要将3.2.1中的配置内容加入到生产者项目中,用于连接rabbitmq服务
  2. 使用SpringBoot内置的RabbitTemplate对象完成消息发送
@Autowired
private RabbitTemplate rabbitTemplate;

public void sendMessage2Queue(String message) {
    rabbitTemplate.convertAndSend("exchangeName","routingKey",message);
}
  • convertAndSend方法将消息message发送到exchangeName交换机,并通过routingKey转发到绑定的queue中
  • routingKey值为空字符串时会转发至所有绑定的queue中

3.4 消费者读取数据

消费者作为消费数据的一方,需要对rabbitmq中指定的队列容器进行监听,并在队列中存在数据时进行消费。

  1. 项目中同样需要加入如3.2.1的rabbitmq连接配置
  2. 使用@RabbitListener注解类监听指定队列,并使用@RabbitHandler注解方法读取消息数据
@Component
@RabbitListener(queues = {"queueName"})
public class RabbitMQConsumer {

    @RabbitHandler
    public void consumer(String message){
        System.out.println("获取到队列中消息:" + message);
    }

}