Spring Boot 启动时自动配置 RabbitMQ 交换机、队列和绑定关系

在使用 Spring Boot 开发消息队列应用时,我们经常需要在应用启动时自动创建 RabbitMQ 的交换机、队列和绑定关系。本文将介绍如何通过 Spring Boot 的启动后执行方法来实现这一功能,并提供相应的演示代码和依赖配置。

一、添加依赖

为了在 Spring Boot 项目中使用 RabbitMQ,首先需要添加 RabbitMQ 的依赖。在 pom.xml 文件中添加以下依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

这个依赖引入了 Spring AMQP,简化了与 RabbitMQ 的集成。

二、配置 RabbitMQ

在 Spring Boot 的配置文件 application.propertiesapplication.yml 中,配置 RabbitMQ 的连接信息。以下是 application.yml 的配置示例:

yaml 复制代码
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

三、演示代码

以下是使用 @Configuration 注解、 @PostConstruct 注解、CommandLineRunner 接口和 ApplicationListener 接口来在 Spring Boot 启动时创建 RabbitMQ 交换机、队列和绑定关系的代码示例。

使用 @Configuration注解

java 复制代码
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

    @Bean
    public Queue myQueue() {
        return new Queue("myQueue", true);
    }

    @Bean
    public TopicExchange myExchange() {
        return new TopicExchange("myExchange");
    }

    @Bean
    public Binding binding() {
        return BindingBuilder.bind(myQueue()).to(myExchange()).with("routingKey");
    }
}

使用 @PostConstruct 注解

java 复制代码
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class RabbitMQConfig {

    @Autowired
    private ConnectionFactory connectionFactory;

    @PostConstruct
    public void init() {
        RabbitAdmin admin = new RabbitAdmin(connectionFactory);
        // 定义交换机
        admin.declareExchange(new TopicExchange("myExchange"));
        // 定义队列
        admin.declareQueue(new Queue("myQueue"));
        // 定义绑定关系
        admin.declareBinding(BindingBuilder.bind(new Queue("myQueue")).to(new TopicExchange("myExchange")).with("routingKey"));
    }
}

实现 CommandLineRunner 接口

java 复制代码
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;


@Component
public class RabbitMQInitializer implements CommandLineRunner {

    @Autowired
    private ConnectionFactory connectionFactory;

    @Override
    public void run(String... args) throws Exception {
        RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);

        // 定义交换机
        rabbitAdmin.declareExchange(new TopicExchange("myExchange"));
        // 定义队列
        rabbitAdmin.declareQueue(new Queue("myQueue"));
        // 定义绑定关系
        rabbitAdmin.declareBinding(BindingBuilder.bind(new Queue("myQueue")).to(new TopicExchange("myExchange")).with("routingKey"));
    }
}

实现 ApplicationListener 接口

java 复制代码
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

@Component
public class RabbitMQApplicationListener implements ApplicationListener<ContextRefreshedEvent> {


    @Autowired
    private ConnectionFactory connectionFactory;


    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);

        // 定义交换机
        rabbitAdmin.declareExchange(new TopicExchange("myExchange"));
        // 定义队列
        rabbitAdmin.declareQueue(new Queue("myQueue"));
        // 定义绑定关系
        rabbitAdmin.declareBinding(BindingBuilder.bind(new Queue("myQueue")).to(new TopicExchange("myExchange")).with("routingKey"));
    }
}

以上方法都可以在 Spring Boot 应用启动后自动配置 RabbitMQ 的交换机、队列和绑定关系,你可以根据实际需求选择合适的方法。希望这篇文章能帮助你更好地理解和应用 Spring Boot 与 RabbitMQ 的集成。

相关推荐
JosieBook4 小时前
【SpringBoot】21-Spring Boot中Web页面抽取公共页面的完整实践
前端·spring boot·python
刘一说4 小时前
Spring Boot+Nacos+MySQL微服务问题排查指南
spring boot·mysql·微服务
叫我阿柒啊8 小时前
从Java全栈到云原生:一场技术深度对话
java·spring boot·docker·微服务·typescript·消息队列·vue3
计算机毕设定制辅导-无忧学长8 小时前
MQTT 与 Java 框架集成:Spring Boot 实战(一)
java·网络·spring boot
叫我阿柒啊8 小时前
从Java全栈到Vue3实战:一次真实面试的深度复盘
java·spring boot·微服务·vue3·响应式编程·前后端分离·restful api
泉城老铁9 小时前
Spring Boot中实现多线程分片下载
java·spring boot·后端
泉城老铁9 小时前
Spring Boot中实现多文件打包下载
spring boot·后端·架构
泉城老铁9 小时前
Spring Boot中实现大文件分片下载和断点续传功能
java·spring boot·后端
友莘居士9 小时前
长流程、复杂业务流程分布式事务管理实战
spring boot·rocketmq·saga·复杂流程分布式事务·长流程
百思可瑞教育9 小时前
Spring Boot 参数校验全攻略:从基础到进阶
运维·服务器·spring boot·后端·百思可瑞教育·北京百思教育