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 的集成。

相关推荐
雨辰AI5 小时前
生产级实测:SpringBoot3 + 达梦数据库接口从 200ms 优化至 20ms 完整调优指南
java·数据库·spring boot·后端·政务
砍材农夫7 小时前
物联网实战|Spring Boot + Netty 搭建 MQTT 消息路由与流转层
java·spring boot·后端·物联网·spring
lazy H8 小时前
Spring Boot 项目如何连接 Redis?新手入门配置和常见错误总结
ide·spring boot·redis·后端·学习·intellij-idea
SXJR8 小时前
spring boot + langchain4j +milvus实现向量存储
java·spring boot·后端·大模型·milvus·rag·langchain4j
王木风8 小时前
Spring Boot + LLM 工程化:把短视频流水线拆成 16 个独立角色的踩坑记录
人工智能·spring boot·后端·开源·新媒体运营·音视频·agent
心之伊始9 小时前
Spring AI Chat Memory 实战:用 JDBC 给 Java Agent 加会话记忆
java·spring boot·agent·spring ai·chat memory
柏舟飞流10 小时前
Spring Boot 进阶实战:整合 MyBatis、Redis、JWT,搭一个更像真实项目的后端服务
spring boot·redis·mybatis
llz_11210 小时前
web-第六次课后作业
前端·spring boot·后端
柏舟飞流10 小时前
Spring Boot + Spring Security + RBAC:从登录鉴权到权限模型设计
java·spring boot·spring
2601_9619633811 小时前
Spring Boot集成电子签章的7个典型问题与解决方案:从入门到生产级实践
大数据·人工智能·spring boot·python·区块链·智能合约