SpringBoot使用RabbitMQ自动创建Exchange和Queue

背景

小项目,使用RabbitMQ作为消息队列,发布到不同的新环境时,由于新搭建的MQ中不存在Exchange和Queue,就会出错,还得手动去创建,比较麻烦,于是想在代码中将这些定义好后,自动控制MQ去创建。

原理与步骤

  1. 第一步定义RabbitAdmin Bean
  2. 第二步定义交换机 Bean
  3. 第三步定义Queue Bean
  4. 第四步定义Binding Bean, 这一步最关键,即将Queue与交换机

完整代码如下,定义如下代码后,即便使用新的MQ,启动项目也会自动创建,但是请注意 virtual-host 是无法被自动创建的(我目前的研究是这样,有自动创建的办法请留言告诉我,谢谢),因此如果不使用默认的virtual-host,请在MQ控制台中去创建。

package com.app.config;

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author Administrator
 * @date 2023/8/4 16:25
 * @description
 */
@Configuration
public class RabbitConfig {

    @Autowired
    private ConnectionFactory connectionFactory;

    @Bean
    public RabbitAdmin rabbitAdmin() {
        RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
        rabbitAdmin.setAutoStartup(true);
        return rabbitAdmin;
    }

    @Bean("addOrderExchange")
    public DirectExchange addOrderExchange() {
        return ExchangeBuilder
                .directExchange("addOrderExchange")
                .durable(true)
                .build();
    }

    @Bean("defaultExchange")
    public DirectExchange defaultExchange() {
        return ExchangeBuilder
                .directExchange("")
                .durable(true)
                .build();
    }

    @Bean("addEvtDayInvest")
    public Queue addEvtDayInvest() {
        Queue queue = QueueBuilder.durable("addEvtDayInvest").build();
        rabbitAdmin().declareQueue(queue);
        return queue;
    }


    @Bean("addEvtDayInvestBind")
    public Binding addEvtDayInvestBind() {
        return BindingBuilder.bind(addEvtDayInvest()).to(addOrderExchange()).with("");
    }

    @Bean("addMemberData")
    public Queue addMemberData() {
        Queue queue = QueueBuilder.durable("addMemberData").build();
        rabbitAdmin().declareQueue(queue);
        return queue;
    }


    @Bean("addMemberDataBind")
    public Binding addMemberDataBind() {
        return BindingBuilder.bind(addMemberData()).to(addOrderExchange()).with("");
    }

    @Bean("addRepaymentPlant")
    public Queue addRepaymentPlant() {
        Queue queue = QueueBuilder.durable("addRepaymentPlant").build();
        rabbitAdmin().declareQueue(queue);
        return queue;
    }


    @Bean("addRepaymentPlantBind")
    public Binding addRepaymentPlantBind() {
        return BindingBuilder.bind(addRepaymentPlant()).to(addOrderExchange()).with("");
    }


    @Bean("imQueue")
    public Queue imQueue() {
        Queue queue = QueueBuilder.durable("imQueue").build();
        rabbitAdmin().declareQueue(queue);
        return queue;
    }


    @Bean("imQueueBind")
    public Binding imQueueBind() {
        return BindingBuilder.bind(imQueue()).to(defaultExchange()).withQueueName();
    }


    @Bean("settleInterestQueue")
    public Queue settleInterestQueue() {
        Queue queue = QueueBuilder.durable("settleInterestQueue").build();
        rabbitAdmin().declareQueue(queue);
        return queue;
    }


    @Bean("settleInterestQueueBind")
    public Binding settleInterestQueueBind() {
        return BindingBuilder.bind(settleInterestQueue()).to(defaultExchange()).withQueueName();
    }


    @Bean("registerQueue")
    public Queue registerQueue() {
        Queue queue = QueueBuilder.durable("registerQueue").build();
        rabbitAdmin().declareQueue(queue);
        return queue;
    }


    @Bean("registerQueueBind")
    public Binding registerQueueBind() {
        return BindingBuilder.bind(registerQueue()).to(defaultExchange()).withQueueName();
    }

    @Bean("memberLoginLogQueue")
    public Queue memberLoginLogQueue() {
        Queue queue = QueueBuilder.durable("memberLoginLogQueue").build();
        rabbitAdmin().declareQueue(queue);
        return queue;
    }


    @Bean("memberLoginLogQueueBind")
    public Binding memberLoginLogQueueBind() {
        return BindingBuilder.bind(memberLoginLogQueue()).to(defaultExchange()).withQueueName();
    }


    @Bean("addParentDataQueue")
    public Queue addParentDataQueue() {
        Queue queue = QueueBuilder.durable("addParentDataQueue").build();
        rabbitAdmin().declareQueue(queue);
        return queue;
    }


    @Bean("addParentDataQueueBind")
    public Binding addParentDataQueueBind() {
        return BindingBuilder.bind(addParentDataQueue()).to(defaultExchange()).withQueueName();
    }


    @Bean("addOrderQueue")
    public Queue addOrderQueue() {
        Queue queue = QueueBuilder.durable("addOrderQueue").build();
        rabbitAdmin().declareQueue(queue);
        return queue;
    }


    @Bean("addOrderQueueBind")
    public Binding addOrderQueueBind() {
        return BindingBuilder.bind(addOrderQueue()).to(defaultExchange()).withQueueName();
    }
    @Bean("memberPerformanceQueue")
    public Queue memberPerformanceQueue() {
        Queue queue =  QueueBuilder.durable("memberPerformanceQueue").build();
        rabbitAdmin().declareQueue(queue);
        return queue;
    }


    @Bean("memberPerformanceQueueBind")
    public Binding memberPerformanceQueueBind() {
        return BindingBuilder.bind(memberPerformanceQueue()).to(defaultExchange()).withQueueName();
    }


    @Bean("computeExpectedIncomeQueue")
    public Queue computeExpectedIncomeQueue() {
        Queue queue = QueueBuilder.durable("computeExpectedIncomeQueue").build();
        rabbitAdmin().declareQueue(queue);
        return queue;
    }


    @Bean("computeExpectedIncomeQueueBind")
    public Binding computeExpectedIncomeQueueBind() {
        return BindingBuilder.bind(computeExpectedIncomeQueue()).to(defaultExchange()).withQueueName();
    }

    /**
     * 自定义 json 格式发送消息
     *
     * @return
     */
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }

}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot集成RabbitMQ可以通过以下步骤完成: 1. 添加Maven依赖:在pom.xml文件中添加RabbitMQSpring Boot Starter依赖。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 配置RabbitMQ连接信息:在application.properties(或application.yml)文件中配置RabbitMQ的连接信息。 ```properties spring.rabbitmq.host=your_rabbitmq_host spring.rabbitmq.port=your_rabbitmq_port spring.rabbitmq.username=your_rabbitmq_username spring.rabbitmq.password=your_rabbitmq_password ``` 3. 创建RabbitMQ发送者:创建一个发送消息的类,使用`RabbitTemplate`发送消息到指定的交换机和队列。 ```java import org.springframework.amqp.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class RabbitMQSender { @Autowired private RabbitTemplate rabbitTemplate; public void sendMessage(String exchange, String routingKey, Object message) { rabbitTemplate.convertAndSend(exchange, routingKey, message); } } ``` 4. 创建RabbitMQ接收者:创建一个接收消息的类,使用`@RabbitListener`注解监听指定的队列,处理接收到的消息。 ```java import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class RabbitMQReceiver { @RabbitListener(queues = "your_queue_name") public void receiveMessage(Object message) { // 处理接收到的消息 System.out.println("Received message: " + message.toString()); } } ``` 5. 发送和接收消息:在需要发送或接收消息的地方调用对应的方法。 ```java @Autowired private RabbitMQSender rabbitMQSender; public void sendMessage() { rabbitMQSender.sendMessage("your_exchange_name", "your_routing_key", "Hello, RabbitMQ!"); } ``` 以上是基本的使用方式,你可以根据实际需求进行扩展和配置。注意,你还需要安装并启动RabbitMQ服务。 希望对你有所帮助!如果有任何疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值