2024/5/13 SpringBoot配置多个RabbitMQ

目录

 一、单个RabbitMQ配置

        1.1、导入Maven坐标

        1.2、yaml配置

        1.3、java配置类

                1.3.1、交换机配置

                1.3.2、队列配置

                1.3.3、绑定配置

                1.3.4、连接配置

        1.4、生产者与消费者操作配置

                1.4.1、生产者操作配置

                1.4.2、消费者操作配置

二、多个RabbitMQ配置

        2.1、yaml配置 

        2.2、java配置类

         2.3、生产者与消费者操作配置

                2.3.1、生产者操作配置

                2.3.1、消费者操作配置

三、总结 


需求描述:原SpringBoot工程已经配置了一个RabbitMQ,现需求是再配置一个RabbitMQ,实现效果是不同RabbitMQ推送到不同的队列中,且互不干扰影响使用。

 一、单个RabbitMQ配置

        1.1、导入Maven坐标

        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.10.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
            <version>2.4.4</version>
        </dependency>

        1.2、yaml配置

  rabbitmq:
    host: xx.xxx.xxx.xxx
    port: xxxx
    username: xxxx
    password: xxxxxx
    virtual-host: xxxx
    publisher-returns: true
    publisher-confirms: true
    listener:
       simple:
         default-requeue-rejected: true
           retry:
            enabled: false
            max-attempts: 3
            initial-interval: 5000

        1.3、java配置类

                1.3.1、交换机配置

package com.ruoyi.report.config;

import org.springframework.amqp.core.DirectExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class ExchangeConfig {

    public static final String ecoa_exchange = "ecoaExchange";

    /**
     * 1.定义direct exchange
     * 2.durable="true" rabbitmq重启的时候不需要创建新的交换机
     * 3.direct交换器相对来说比较简单,匹配规则为:如果路由键匹配,消息就被投送到相关的队列
     */
    @Bean
    public DirectExchange ecoaExchange() {
        DirectExchange directExchange = new DirectExchange(ecoa_exchange, true, false);
        return directExchange;
    }

}

                1.3.2、队列配置

package com.ruoyi.report.config;

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

/**
 * @ClassName QueueConfig
 * @Description
 * @Author Mr.Huang
 * @Date 2023/9/22 16:26
 * @Version 1.0
 **/
@Component
public class QueueConfig {

    private static final String ecoa_file_upload_queue = "ecoa_file_upload_queue";

    @Bean
    public Queue ecoaFileUploadDispatchQueue() {
        /**
         durable="true" 持久化 rabbitmq重启的时候不需要创建新的队列
         auto-delete 表示消息队列没有在使用时将被自动删除 默认是false
         exclusive  表示该消息队列是否只在当前connection生效,默认是false
         */
        return new Queue(ecoa_file_upload_queue, true, false, false);
    }
}

                1.3.3、绑定配置

package com.ruoyi.report.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

/**
 * @ClassName BindingConfig
 * @Description
 * @Author Mr.Huang
 * @Date 2023/9/22 16:31
 * @Version 1.0
 **/
@Component
public class BindingConfig {
    @Autowired
    private QueueConfig queueConfig;
    @Autowired
    private ExchangeConfig exchangeConfig;

    public static final String ECOA_file_upload_key = "ecoa_file_upload_key";


    @Bean
    public Binding ecoaFileUploadDispatchBinding() {
        return BindingBuilder.bind(queueConfig.ecoaFileUploadDispatchQueue()).to(exchangeConfig.ecoaExchange()).with(ECOA_file_upload_key);
    }
}

                1.3.4、连接配置

package com.ruoyi.report.config;

import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @ClassName RabbitMqConfig
 * @Description
 * @Author Mr.Huang
 * @Date 2023/9/22 16:14
 * @Version 1.0
 **/
@Configuration
public class RabbitMqConfig {
    /**
     * 连接工厂
     */
    @Autowired
    private ConnectionFactory connectionFactory;

    /**
     * 自定义rabbit template用于数据的接收和发送
     * 可以设置消息确认机制和回调
     *
     * @return
     */
    @Bean
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        return template;
    }
}

        1.4、生产者与消费者操作配置

                1.4.1、生产者操作配置

package com.ruoyi.report.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.report.config.BindingConfig;
import com.ruoyi.report.config.ExchangeConfig;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.UUID;

/**
 * @ClassName MessageUtils
 * @Description
 * @Author Mr.Huang
 * @Date 2023/9/22 16:36
 * @Version 1.0
 **/
@Component
public class MessageUtils {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 发送消息
     * 发送随货单信息
     * @param message 消息
     */
    public void sendMessage(Object message) {
        String uuid = UUID.randomUUID().toString();
        CorrelationData correlationId = new CorrelationData(uuid);
        Message msg = MessageBuilder.withBody(JSON.toJSONStringWithDateFormat(message, "yyyy-MM-dd HH:mm:ss", SerializerFeature.WriteNullStringAsEmpty).getBytes()).setContentType(MessageProperties.CONTENT_TYPE_JSON).build();
        rabbitTemplate.convertAndSend(ExchangeConfig.ecoa_exchange, BindingConfig.ECOA_file_upload_key, msg, correlationId);
    }
}

                1.4.2、消费者操作配置

package com.ruoyi.report.consumer;

import com.alibaba.fastjson.JSONObject;
import com.rabbitmq.client.Channel;
import com.ruoyi.report.config.RabbitMqConfig;
import com.ruoyi.report.entity.open.PrintResult;
import com.ruoyi.report.service.open.PrintSendLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @ClassName PrintFeedbackConsumer
 * @Description
 * @Author Mr.Huang
 * @Date 2024/4/30 10:23
 * @Version 1.0
 **/
@Slf4j
@Component
public class PrintFeedbackConsumer {

    @Autowired
    private PrintSendLogService printSendLogService;

    @RabbitListener(queues = {RabbitMqConfig.print_4pl_dispatch_info_feedback_queue}, containerFactory = "printContainerFactory")
    public void receiveMq(Message message, Channel channel) {
        try {
            String body = new String(message.getBody());
            log.info("接受【Print结果推送】RabbitMQ消息:"+body);
            JSONObject objJson = JSONObject.parseObject(body);
            Thread.sleep(1000);
            PrintResult printResult = JSONObject.toJavaObject(objJson, PrintResult.class);
            printSendLogService.updatePrintSendLog(printResult);
        }catch (Exception e){
            log.error("",e);
            try {
                channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

二、多个RabbitMQ配置

        Maven坐标与上面单个RabbitMQ配置一致

        2.1、yaml配置 

  rabbitmq:
    first:
      host: xx.xxx.xxx.xxx
      port: xxxx
      username: xxxx
      password: xxxxxx
      virtual-host: xxxx
      publisher-returns: true
      publisher-confirms: true
      listener:
          simple:
            default-requeue-rejected: true
            retry:
              enabled: false
              max-attempts: 3
              initial-interval: 5000          
    second:
      host: xx.xxx.xxx.xxx
      port: xxxx
      username: xxxx
      password: xxxxxx
      publisher-returns: true
      publisher-confirms: true
      virtual-host: xxxx
      listener:
          simple:
            default-requeue-rejected: true
            retry:
              enabled: false
              max-attempts: 3
              initial-interval: 5000 

        2.2、java配置类

package com.ruoyi.report.config;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.Connection;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * @ClassName RabbitMqConfig
 * @Description
 * @Author Mr.Huang
 * @Date 2023/9/22 16:14
 * @Version 1.0
 **/
@Configuration
public class RabbitMqConfig {
    // 第一个MQ电子药检队列与key
    public static final String ECOA_file_upload_queue = "ecoa_file_upload_queue";
    public static final String ECOA_file_upload_key = "ecoa_file_upload_key";

    // 第二个MQ单据打印平台队列与key
    public static final String print_tms_dispatch_info_queue = "print_tms_dispatch_info_queue";
    public static final String print_4pl_dispatch_info_feedback_queue = "print_4pl_dispatch_info_feedback_queue";
    public static final String print_tms_dispatch_info_key = "print_tms_dispatch_info_key";
    public static final String print_4pl_dispatch_info_feedback_key = "print_4pl_dispatch_info_feedback_key";
    /** 交换机名称 */
    public static final String EXCHANGE = "ecoaExchange";
    public static final String EXCHANGE2 = "tms_exchange";

    /** 第一个rabbitMq队列 */
    @Bean(name = "ECOAConnectionFactory")
    @Primary
    public ConnectionFactory ECOAConnectionFactory(@Value("${spring.rabbitmq.first.host}") String host,
                                                  @Value("${spring.rabbitmq.first.port}") int port,
                                                  @Value("${spring.rabbitmq.first.username}") String username,
                                                  @Value("${spring.rabbitmq.first.password}") String password,
                                                  @Value("${spring.rabbitmq.first.virtual-host}") String virtualHost) {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setHost(host);
        connectionFactory.setPort(port);
        connectionFactory.setUsername(username);
        connectionFactory.setPassword(password);
        connectionFactory.setVirtualHost(virtualHost);
        return connectionFactory;
    }

    /** 第二个rabbitMq队列 */
    @Bean(name = "printConnectionFactory")
    public ConnectionFactory printConnectionFactory(@Value("${spring.rabbitmq.second.host}") String host,
                                                   @Value("${spring.rabbitmq.second.port}") int port,
                                                   @Value("${spring.rabbitmq.second.username}") String username,
                                                   @Value("${spring.rabbitmq.second.password}") String password,
                                                   @Value("${spring.rabbitmq.second.virtual-host}") String virtualHost) {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setHost(host);
        connectionFactory.setPort(port);
        connectionFactory.setUsername(username);
        connectionFactory.setPassword(password);
        connectionFactory.setVirtualHost(virtualHost);
        return connectionFactory;
    }
    /** 第一个rabbitMq操作模板 */
    @Bean(name="ECOARabbitTemplate")
    @Primary
    public RabbitTemplate fplRabbitTemplate(@Qualifier("ECOAConnectionFactory") ConnectionFactory connectionFactory){
        RabbitTemplate firstRabbitTemplate = new RabbitTemplate(connectionFactory);
        return firstRabbitTemplate;
    }
    /** 第二个rabbitMq操作模板 */
    @Bean(name="printRabbitTemplate")
    public RabbitTemplate tcscRabbitTemplate(@Qualifier("printConnectionFactory") ConnectionFactory connectionFactory){
        RabbitTemplate secondRabbitTemplate = new RabbitTemplate(connectionFactory);
        return secondRabbitTemplate;
    }
    /** 第一个rabbitMq连接工厂 */
    @Bean(name="ECOAContainerFactory")
    public SimpleRabbitListenerContainerFactory ECOAContainerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer,
                                                                    @Qualifier("ECOAConnectionFactory") ConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setMaxConcurrentConsumers(5);
        factory.setConcurrentConsumers(1);
        factory.setPrefetchCount(1);
        configurer.configure(factory, connectionFactory);
        return factory;
    }
    /** 第二个rabbitMq连接工厂 */
    @Bean(name="printContainerFactory")
    public SimpleRabbitListenerContainerFactory printContainerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer,
                                                                     @Qualifier("printConnectionFactory") ConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setMaxConcurrentConsumers(5);
        factory.setConcurrentConsumers(1);
        factory.setPrefetchCount(1);
        configurer.configure(factory, connectionFactory);
        return factory;
    }
    /** 第一个mq绑定队列绑定交换机 */
    @Bean
    public String runECOAQueue(@Qualifier("ECOAConnectionFactory") ConnectionFactory connectionFactory) {
        System.out.println("configuration ECOAQueue ........................");
        Connection connection = connectionFactory.createConnection();
        Channel channel = connection.createChannel(false);
        try {
            channel.exchangeDeclare(EXCHANGE, "direct", true, false, null);
            // 单据推送电子药检队列
            channel.queueDeclare(ECOA_file_upload_queue, true, false, false, null);
            channel.queueBind(ECOA_file_upload_queue, EXCHANGE, ECOA_file_upload_key);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return "ECOAQueue";
        }
    }
    /** 第二个mq绑定队列绑定交换机 */
    @Bean
    public String runPrintQueue(@Qualifier("printConnectionFactory") ConnectionFactory connectionFactory) {
        System.out.println("configuration printQueue ........................");
        Connection connection = connectionFactory.createConnection();
        Channel channel = connection.createChannel(false);
        try {
            channel.exchangeDeclare(EXCHANGE2, "direct", true, false, null);
            // 单据推送单据打印平台队列
            channel.queueDeclare(print_tms_dispatch_info_queue, true, false, false, null);
            channel.queueBind(print_tms_dispatch_info_queue, EXCHANGE2, print_tms_dispatch_info_key);
            // 单据打印平台反馈队列
            channel.queueDeclare(print_4pl_dispatch_info_feedback_queue,true,false,false,null);
            channel.queueBind(print_4pl_dispatch_info_feedback_queue,EXCHANGE2,print_4pl_dispatch_info_feedback_key);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return "printQueue";
        }
    }
}

注意:需将原MQ:交换机、队列、绑定配置类注释掉,只留这一个配置文件即可,这个配置文件已经将对应的:交换机、队列绑定好,只是需要注意队列名字、交换机不要绑定错了

         2.3、生产者与消费者操作配置

                2.3.1、生产者操作配置

package com.ruoyi.report.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.ruoyi.report.config.RabbitMqConfig;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.UUID;

/**
 * @ClassName MessageUtils
 * @Description
 * @Author Mr.Huang
 * @Date 2023/9/22 16:36
 * @Version 1.0
 **/
@Component
public class MessageUtils {

    @Resource(name = "ECOARabbitTemplate")
    private RabbitTemplate ECOARabbitTemplate;

    @Resource(name = "printRabbitTemplate")
    private RabbitTemplate printRabbitTemplate;

    /**
     * 向ECOA发送消息
     * 发送随货单信息
     * @param message 消息
     */
    public void sendMessage(Object message) {
        String uuid = UUID.randomUUID().toString();
        CorrelationData correlationId = new CorrelationData(uuid);
        Message msg = MessageBuilder.withBody(JSON.toJSONStringWithDateFormat(message, "yyyy-MM-dd HH:mm:ss", SerializerFeature.WriteNullStringAsEmpty).getBytes()).setContentType(MessageProperties.CONTENT_TYPE_JSON).build();
        ECOARabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE, RabbitMqConfig.ECOA_file_upload_key, msg, correlationId);
    }

    /**
     * 向print发送消息
     * 发送派车单信息
     * @param message 消息
     */
    public void sendPrintMessage(Object message) {
        String uuid = UUID.randomUUID().toString();
        CorrelationData correlationId = new CorrelationData(uuid);
        Message msg = MessageBuilder.withBody(JSON.toJSONStringWithDateFormat(message, "yyyy-MM-dd HH:mm:ss", SerializerFeature.WriteNullStringAsEmpty).getBytes()).setContentType(MessageProperties.CONTENT_TYPE_JSON).build();
        printRabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE2, RabbitMqConfig.print_tms_dispatch_info_key, msg, correlationId);
    }
}

                2.3.1、消费者操作配置

package com.ruoyi.report.consumer;

import com.alibaba.fastjson.JSONObject;
import com.rabbitmq.client.Channel;
import com.ruoyi.report.config.RabbitMqConfig;
import com.ruoyi.report.entity.open.PrintResult;
import com.ruoyi.report.service.open.PrintSendLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @ClassName PrintFeedbackConsumer
 * @Description
 * @Author Mr.Huang
 * @Date 2024/4/30 10:23
 * @Version 1.0
 **/
@Slf4j
@Component
public class PrintFeedbackConsumer {

    @Autowired
    private PrintSendLogService printSendLogService;

    @RabbitListener(queues = {RabbitMqConfig.print_4pl_dispatch_info_feedback_queue}, containerFactory = "printContainerFactory")
    public void receiveMq(Message message, Channel channel) {
        try {
            String body = new String(message.getBody());
            log.info("接受【Print结果推送】RabbitMQ消息:"+body);
            JSONObject objJson = JSONObject.parseObject(body);
            Thread.sleep(1000);
            PrintResult printResult = JSONObject.toJavaObject(objJson, PrintResult.class);
            printSendLogService.updatePrintSendLog(printResult);
        }catch (Exception e){
            log.error("",e);
            try {
                channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

与单个RabbitMQ消费者操作一致,只是注意要消费的队列和连接工厂不要搞错了

三、总结 

配置单个RabbitMQ时不需要关心底层的连接工厂是如何配置的,当把yaml内容填好它会自动配置连接工厂,只需要把交换机、队列、配置绑定起来即可。 当需要配置多个mq时才需要自己手动配置连接工厂,并不是只能配置两个RabbitMQ,可以按这个格式配置更多个。唯一注意的是不要把这些队列和交换机搞混了即可。

  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Spring Boot可以很容易地配置多个RabbitMQ实例。以下是配置多个RabbitMQ实例的步骤: 1. 在application.properties文件中添加多个RabbitMQ实例的配置信息。例如: spring.rabbitmq.host=host1 spring.rabbitmq.port=5672 spring.rabbitmq.username=user1 spring.rabbitmq.password=password1 spring.rabbitmq.second.host=host2 spring.rabbitmq.second.port=5672 spring.rabbitmq.second.username=user2 spring.rabbitmq.second.password=password2 2. 创建多个RabbitTemplate和ConnectionFactory bean。例如: @Configuration public class RabbitMQConfig { @Bean public ConnectionFactory connectionFactory() { CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); connectionFactory.setHost(env.getProperty("spring.rabbitmq.host")); connectionFactory.setPort(env.getProperty("spring.rabbitmq.port", Integer.class)); connectionFactory.setUsername(env.getProperty("spring.rabbitmq.username")); connectionFactory.setPassword(env.getProperty("spring.rabbitmq.password")); return connectionFactory; } @Bean public RabbitTemplate rabbitTemplate() { RabbitTemplate template = new RabbitTemplate(connectionFactory()); return template; } @Bean(name = "secondConnectionFactory") public ConnectionFactory secondConnectionFactory() { CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); connectionFactory.setHost(env.getProperty("spring.rabbitmq.second.host")); connectionFactory.setPort(env.getProperty("spring.rabbitmq.second.port", Integer.class)); connectionFactory.setUsername(env.getProperty("spring.rabbitmq.second.username")); connectionFactory.setPassword(env.getProperty("spring.rabbitmq.second.password")); return connectionFactory; } @Bean(name = "secondRabbitTemplate") public RabbitTemplate secondRabbitTemplate() { RabbitTemplate template = new RabbitTemplate(secondConnectionFactory()); return template; } } 3. 在需要使用RabbitMQ的地方,注入对应的RabbitTemplate或ConnectionFactory bean即可。例如: @Autowired private RabbitTemplate rabbitTemplate; @Autowired @Qualifier("secondRabbitTemplate") private RabbitTemplate secondRabbitTemplate; 使用以上步骤,就可以在Spring Boot应用中配置多个RabbitMQ实例了。 ### 回答2: 在Spring Boot配置多个RabbitMQ会让应用程序变得更加灵活,这意味着应用可以与多个RabbitMQ实例连接,并能够发送和接收消息。 Spring Boot通过在配置文件(application.properties或application.yml)中定义多个RabbitMQ实例来实现多个RabbitMQ配置。下面是在同一应用程序中配置两个RabbitMQ实例的示例: 在application.yml文件中添加以下内容: ``` spring.rabbitmq.host=server1 spring.rabbitmq.port=5672 spring.rabbitmq.username=user1 spring.rabbitmq.password=password1 spring.rabbitmq.virtual-host=/vhost1 spring.rabbitmq.second.host=server2 spring.rabbitmq.second.port=5672 spring.rabbitmq.second.username=user2 spring.rabbitmq.second.password=password2 spring.rabbitmq.second.virtual-host=/vhost2 ``` 在上面的示例中,我们定义了两个RabbitMQ实例,一个用于服务器1,另一个用于服务器2。对于每个实例,我们指定了名称,主机名,端口,用户名,密码和虚拟主机。 为了使用以上配置,我们需要通过@Resource注解或@Autowired注解在Java类中定义一个RabbitTemplate bean。同时在需要连接第二个RabbitMQ实例的地方指定使用哪个RabbitMQ实例即可。例如: ``` @SpringBootApplication public class DemoApplication implements CommandLineRunner { @Autowired private RabbitTemplate rabbitTemplate; @Autowired @Qualifier("secondRabbitTemplate") private RabbitTemplate secondRabbitTemplate; public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Override public void run(String... args) throws Exception { rabbitTemplate.convertAndSend("queue1", "message1"); secondRabbitTemplate.convertAndSend("queue2", "message2"); } } ``` 在上面的代码中,我们注入了两个不同的RabbitTemplate实例,分别用于发送到不同的RabbitMQ实例。我们可以使用这两个实例来发送消息到不同的队列。在这个例子中,我们把“message1”发送到“queue1”,把“message2” 发送到“queue2”。 总之,配置多个RabbitMQ实例可以让Spring Boot应用程序与多个RabbitMQ连接,并实现更复杂的异构应用程序。我们只需要简单地在配置文件中添加多个实例,并通过Java类中的@Resource或@Autowired注解即可使用。 ### 回答3: Spring Boot 是一种流行的 Java 框架,用于快速构建基于 Spring 框架的应用程序。RabbitMQ 是一个流行的开源消息队列,常用于构建分布式系统。Spring Boot 提供了对 RabbitMQ 的支持,并允许用户配置多个 RabbitMQ配置多个 RabbitMQ,可以通过在 application.properties 或 application.yml 文件中添加多个 RabbitMQ配置来实现。如下所示: application.yml: ``` spring: rabbitmq: 1: host: localhost port: 5672 username: guest password: guest virtual-host: / 2: host: localhost port: 5673 username: guest password: guest virtual-host: / ... ``` application.properties: ``` spring.rabbitmq.1.host=localhost spring.rabbitmq.1.port=5672 spring.rabbitmq.1.username=guest spring.rabbitmq.1.password=guest spring.rabbitmq.1.virtual-host=/ spring.rabbitmq.2.host=localhost spring.rabbitmq.2.port=5673 spring.rabbitmq.2.username=guest spring.rabbitmq.2.password=guest spring.rabbitmq.2.virtual-host=/ ... ``` 其中,`1` 和 `2` 表示 RabbitMQ 的标识符。我们可以根据需要添加更多的标识符。在我们的应用程序中,我们可以使用以下方式注入多个RabbitMQ: ``` @Bean @Primary public ConnectionFactory connectionFactory1() { CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost", 5672); connectionFactory.setUsername("guest"); connectionFactory.setPassword("guest"); return connectionFactory; } @Bean public RabbitTemplate rabbitTemplate1(ConnectionFactory connectionFactory1) { return new RabbitTemplate(connectionFactory1); } @Bean public SimpleMessageListenerContainer messageListenerContainer1( ConnectionFactory connectionFactory1) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory1); container.setQueueNames("queue1"); container.setDefaultRequeueRejected(false); container.setMessageListener(messageListenerAdapter1()); return container; } @Bean public MessageListenerAdapter messageListenerAdapter1() { return new MessageListenerAdapter(new MyMessageListener()); } @Bean public ConnectionFactory connectionFactory2() { CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost", 5673); connectionFactory.setUsername("guest"); connectionFactory.setPassword("guest"); return connectionFactory; } @Bean public RabbitTemplate rabbitTemplate2(ConnectionFactory connectionFactory2) { return new RabbitTemplate(connectionFactory2); } @Bean public SimpleMessageListenerContainer messageListenerContainer2( ConnectionFactory connectionFactory2) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory2); container.setQueueNames("queue2"); container.setDefaultRequeueRejected(false); container.setMessageListener(messageListenerAdapter2()); return container; } @Bean public MessageListenerAdapter messageListenerAdapter2() { return new MessageListenerAdapter(new MyMessageListener()); } ``` 这样,在我们的应用程序中就可以使用`rabbitTemplate1`和`rabbitTemplate2`来发送消息,使用 `messageListenerContainer1`和`messageListenerContainer2`监听队列消息。 总结: 在 Spring Boot 配置多个 RabbitMQ 的过程中,我们需要在 application.properties 或 application.yml 中添加多个配置,注入多个 ConnectionFactory,RabbitTemplate 和 SimpleMessageListenerContainer 来进行发送和监听消息。同时,我们还需要根据实际情况调整配置,确保消息传递的正确性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abcdzzr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值