springboot声明(创建)RabbitMQ交换机和队列

在之前我们都是基于RabbitMQ控制台来创建队列、交换机。但是在实际开发时,队列和交换机是程序员定义的,将来项目上线,又要交给运维去创建。那么程序员就需要把程序中运行的所有队列和交换机都写下来,交给运维。在这个过程中是很容易出现错误的。

因此推荐的做法是由程序启动时检查队列和交换机是否存在,如果不存在自动创建。

1. 使用@Bean

java 复制代码
@Configuration
public class FanoutConfig {

    /**
     * 创建一个FanoutExchange实例,用于将消息广播到多个队列。
     * @return FanoutExchange实例
     */
    @Bean
    public FanoutExchange fanoutExchange() {
        return new FanoutExchange("springboot.fanout");
    }

    /**
     * 创建一个队列实例,用于接收广播的消息。
     * @return 队列实例
     */
    @Bean
    public Queue fanoutQueue1() {
        return new Queue("springboot.fanout.queue1");
    }

    /**
     * 创建一个Binding实例,将队列与FanoutExchange绑定。
     * @param fanoutExchange FanoutExchange实例
     * @param fanoutQueue1 队列实例
     * @return Binding实例
     */
    @Bean
    public Binding bindingFanoutQueue1(FanoutExchange fanoutExchange, Queue fanoutQueue1) {
        return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
    }

    /**
     * 创建一个队列实例,用于接收广播的消息。
     * @return 队列实例
     */
    @Bean
    public Queue fanoutQueue2() {
        return new Queue("springboot.fanout.queue2");
    }

    /**
     * 创建一个Binding实例,将队列与FanoutExchange绑定。
     * @param fanoutExchange FanoutExchange实例
     * @param fanoutQueue2 队列实例
     * @return Binding实例
     */
    @Bean
    public Binding bindingFanoutQueue2(FanoutExchange fanoutExchange, Queue fanoutQueue2) {
        return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);
    }
}
java 复制代码
@Configuration
public class DirectConfig {
    /**
     * 创建一个直接交换机
     *
     * @return DirectExchange实例
     */
    @Bean
    public DirectExchange directExchange() {
        return ExchangeBuilder.directExchange("springboot.direct").build();
    }

    /**
     * 创建一个队列
     *
     * @return Queue实例
     */
    @Bean
    public Queue directQueue1() {
        return new Queue("springboot.direct.queue1");
    }

    /**
     * 创建一个绑定队列到交换机的Binding
     *
     * @param directQueue1   队列
     * @param directExchange 交换机
     * @return Binding实例
     */
    @Bean
    public Binding bindingQueue1WithRed(Queue directQueue1, DirectExchange directExchange) {
        return BindingBuilder.bind(directQueue1).to(directExchange).with("red");
    }

    /**
     * 创建一个绑定队列到交换机的Binding
     *
     * @param directQueue1   队列
     * @param directExchange 交换机
     * @return Binding实例
     */
    @Bean
    public Binding bindingQueue1WithBlue(Queue directQueue1, DirectExchange directExchange) {
        return BindingBuilder.bind(directQueue1).to(directExchange).with("blue");
    }

    /**
     * 创建一个队列
     *
     * @return Queue实例
     */
    @Bean
    public Queue directQueue2() {
        return new Queue("springboot.direct.queue2");
    }

    /**
     * 创建一个绑定队列到交换机的Binding
     *
     * @param directQueue2   队列
     * @param directExchange 交换机
     * @return Binding实例
     */
    @Bean
    public Binding bindingQueue2WithRed(Queue directQueue2, DirectExchange directExchange) {
        return BindingBuilder.bind(directQueue2).to(directExchange).with("red");
    }

    /**
     * 创建一个绑定队列到交换机的Binding
     *
     * @param directQueue2   队列
     * @param directExchange 交换机
     * @return Binding实例
     */
    @Bean
    public Binding bindingQueue2WithYellow(Queue directQueue2, DirectExchange directExchange) {
        return BindingBuilder.bind(directQueue2).to(directExchange).with("yellow");
    }
}

2. 使用@RabbitListener

java 复制代码
@Component
public class DirectConsumer {
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "springboot.direct.queue1"),
            exchange = @Exchange(name = "springboot.direct", type = ExchangeTypes.DIRECT),
            key = {"red", "blue"}
    ))
    public void listenDirectQueue1(String msg) {
        System.out.println("消费者1接收到direct.queue1的消息:【" + msg + "】");
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "springboot.direct.queue2"),
            exchange = @Exchange(name = "springboot.direct", type = ExchangeTypes.DIRECT),
            key = {"red", "yellow"}
    ))
    public void listenDirectQueue2(String msg) {
        System.out.println("消费者2接收到direct.queue2的消息:【" + msg + "】");
    }
}
java 复制代码
@Component
public class TopicConsumer {
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "springboot.topic.queue1"),
            exchange = @Exchange(name = "springboot.topic", type = ExchangeTypes.TOPIC),
            key = "china.#"
    ))
    public void listenTopicQueue1(String msg) {
        System.out.println("消费者1接收到topic.queue1的消息:【" + msg + "】");
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "springboot.topic.queue2"),
            exchange = @Exchange(name = "springboot.topic", type = ExchangeTypes.TOPIC),
            key = "#.news"
    ))
    public void listenTopicQueue2(String msg) {
        System.out.println("消费者2接收到topic.queue2的消息:【" + msg + "】");
    }
}
相关推荐
啾啾Fun14 分钟前
Java反射操作百倍性能优化
java·性能优化·反射·缓存思想
20岁30年经验的码农21 分钟前
若依微服务Openfeign接口调用超时问题
java·微服务·架构
曲莫终29 分钟前
SpEl表达式之强大的集合选择(Collection Selection)和集合投影(Collection Projection)
java·spring boot·spring
ajassi20001 小时前
开源 java android app 开发(十二)封库.aar
android·java·linux·开源
q567315231 小时前
Java使用Selenium反爬虫优化方案
java·开发语言·分布式·爬虫·selenium
kaikaile19951 小时前
解密Spring Boot:深入理解条件装配与条件注解
java·spring boot·spring
广州山泉婚姻1 小时前
解锁高效开发:Spring Boot 3和MyBatis-Flex在智慧零工平台后端的应用实战
人工智能·spring boot·spring
守护者1701 小时前
JAVA学习-练习试用Java实现“一个词频统计工具 :读取文本文件,统计并输出每个单词的频率”
java·学习
bing_1581 小时前
Spring Boot 中ConditionalOnClass、ConditionalOnMissingBean 注解详解
java·spring boot·后端
ergdfhgerty1 小时前
斐讯N1部署Armbian与CasaOS实现远程存储管理
java·docker