RabbitMQ整合SpringBoot详解

1. 前言

Spring BootRabbitMQ也提供了自动配置和启动器。

2. 环境搭建

创建一个 Spring Boot基础工程,引入依赖:

 <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.amqp</groupId>
        <artifactId>spring-rabbit-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

该依赖中,引入了spring-rabbit

image-20241021112837814

3. 基本信息配置

RabbitProperties配置类中,可以看到很多相关配置:

image-20241021113008957

最重要当然是配置MQ 的地址、端口、用户名、密码,可以使用两种方式配置:

spring:
  rabbitmq:
    addresses: amqp://guest:guest@localhost
    port: 5672
# 或者
spring:
  rabbitmq:
    username: guest
    password: guest
    host: localhost
    port: 5672

虚拟机配置,虚拟机以/开头,默认为/

spring:
  rabbitmq:
    virtual-host: /

4. 创建交换机和队列

使用ExchangeBuilder 创建交换机,可以创建四种类型的交换机,如下图:

image-20241021113609796

按照相似的方式创建队列、绑定。

@Configuration
public class RabbitMqConfig {

    /**
     * 使用 ExchangeBuilder 创建交换机
     *
     */
    @Bean("bootExchange")
    public Exchange bootExchange() {
        return ExchangeBuilder.directExchange("bootExchange").durable(true).build();
    }

    /**
     * 创建队列
     */
    @Bean("bootQueue")
    public Queue bootQueue() {
        return QueueBuilder.durable("bootQueue").build();
    }

    /**
     * 创建队列和交换机的绑定关系
     */
    @Bean("bootBinding")
    public Binding bootBinding(@Qualifier("bootQueue") Queue bootQueue, @Qualifier("bootExchange") Exchange bootExchange) {
        return BindingBuilder.bind(bootQueue).to(bootExchange).with("boot.key").and(null);
    }
}

启动项目,进入控制台,可以看到相关信息:

image-20241021141518013

5. 消费者

使用@RabbitListener注解标记在方法上,并指定队列名,方法入参Message

@Component
public class RabbitConsumer {

    @RabbitListener(queues = {"bootQueue"})
    public void rabbitListener(Message message) {
        System.out.println("收到消息===" + message);
    }
}

Message对象是Sring集成RabbirMQ提供的消息装载体,主要包含了消息二进制数据body和消息属性MessageProperties

image-20241021141642059

6. 生产者

创建一个生产者,使用RabbitTemplate直接将消息发送到指定的交换机,并指定其路由KEY

@SpringBootTest
public class MqTest {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testRabbitPub() {
        rabbitTemplate.convertAndSend("bootExchange","boot.key","HELLO SPRING BOOT");
    }
}

7. 测试

启动项目,可以看到打印了连接日志:

image-20241021141807805

发送消息,并成功接收到消息,消息包含了消息本身内容和消息属性

image-20241021141906307