Skip to content

RabbitMQ SpringBoot整合MQ

本文介绍如何在Spring Boot中整合RabbitMQ。

1. 引入依赖

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2. 修改配置

2.1 配置RabbitMQ用户与权限

创建新用户

rabbitmqctl add_user <username> <password>
  • <username>: 你想要创建的用户名。
  • <password>: 用户的密码。

例如:

bash
rabbitmqctl add_user app 123456

为创建的用户配置权限

bash
rabbitmqctl set_permissions -p <vhost_name> <username> "<configure_regex>" "<write_regex>" "<read_regex>"
  • -p <vhost_name>: 指定要设置权限的虚拟主机名称。如果你想在默认的 vhost (/) 中设置,则使用 -p /

  • <username>: 刚才创建的用户名。

  • <configure_regex>: 一个正则表达式,定义用户可以配置(创建/删除)哪些队列和交换机。

  • <write_regex>: 一个正则表达式,定义用户可以向哪些交换机发布消息。

  • <read_regex>: 一个正则表达式,定义用户可以从哪些队列消费消息。

例如:

bash
rabbitmqctl set_permissions -p / app ".*" ".*" ".*"

2.2 修改配置文件

在application.properties配置文件中增加RabbitMQ的相关配置:

properties
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=app
spring.rabbitmq.password=123456

3. 生产者代码

在Spring Boot Amqp中,提供了AmqpTemplate类对象来操作发送消息,我们只需要注入该对象,调用该对象的convertAndSend()方法即可:

java
@RestController
public class RabbitMQController {

    @Resource
    private AmqpTemplate rabbitMQTemplate;

    @PostMapping("/sendMessage")
    public String sendMessage(@RequestBody MQSendMessage message){
        rabbitMQTemplate.convertAndSend(message.getExchange(),
                message.getRouteKey(),
                message.getMessage()
        );
        return "ok";
    }
}
java
@Data
public class MQSendMessage {
    private String exchange;
    private String routeKey;
    private String message;
}

convertAndSend()方法有三个参数:

  • 第一个参数:交换机名称;
  • 第二个参数:路由规则;
  • 第三个参数:要发送的消息内容;

在Postman中测试如下:

image-20250622160320553

在RabbitMQ管理界面中查看,消息已成功发送到消息队列:

image-20250622160529822

4. 消费者代码

在Spring Boot中,可以在容器内的实体的方法上标注@RabbitListener注解,用于声明该方法为消费消息的方法,注解参数queues用于指明监听的队列名,方法参数Message用于接收消息:

java
@Slf4j
@Component
public class RabbitMQListener {

    @RabbitListener(queues = {"route_queue_2"})
    public void processMessage(Message message){
        String data = new String(message.getBody());
        log.info(data);
    }
}

5. [可选]配置代码

我们可以在Spring Boot中通过配置代码,创建交换机和队列,并制定绑定关系:

java
@Configuration
public class RabbitMQConfig {

    // 队列名称
    public static final String QUEUE_NAME = "queue.springboot.test";
    // 交换机名称
    public static final String EXCHANGE_NAME = "exchange.springboot.test";
    // 路由键
    public static final String ROUTING_KEY = "routing.springboot.test";

    // 声明队列
    @Bean
    public Queue queue() {
        // 第二个参数表示该队列是否为持久化的
        return new Queue(QUEUE_NAME, true);
    }

    // 声明交换机
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange(EXCHANGE_NAME);
    }

    // 将队列绑定到交换机,并指定路由键
    @Bean
    public Binding binding(Queue queue, DirectExchange directExchange) {
        return BindingBuilder.bind(queue).to(directExchange).with(ROUTING_KEY);
    }
}

启动Spring Boot项目,然后查看RabbitMQ管理界面,可以看到交换机和队列已成功创建:

image-20250622162106707