美文网首页
Spring Boot 配置多个RabbitMQ

Spring Boot 配置多个RabbitMQ

作者: Java_Explorer | 来源:发表于2022-08-07 18:41 被阅读0次

    在项目中经常遇到一个Spring Boot工程要连接多个RabbitMQ。如果只连接一个,Spring Boot可以零配置连接RabbitMQ,这样不需要做额外的工作。但如果连接多个RabbitMQ,就得做一些配置了。

    配置文件

    application.properties

    spring.application.name=rabbitmq-hello
     
    # RabbitMQ
    spring.rabbitmq.first.host=node9
    spring.rabbitmq.first.port=5670
    spring.rabbitmq.first.username=guest
    spring.rabbitmq.first.password=guest
     
    spring.rabbitmq.second.host=localhost
    spring.rabbitmq.second.port=5672
    spring.rabbitmq.second.username=guest
    spring.rabbitmq.second.password=guest
     
    # MySQL
    spring.datasource.url = jdbc:mysql://localhost:3306/cloudtest
    spring.datasource.username = root
    spring.datasource.password = root
    spring.datasource.driverClassName = com.mysql.jdbc.Driver
    

    代码

    程序入口

    HelloApplication.java

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
     
    @SpringBootApplication
    public class HelloApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(HelloApplication.class, args);
        }
    
    }
    

    RabbitMQ配置类

    RabbitConfig.java

    import org.springframework.amqp.core.Queue;
    import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
    import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
    import org.springframework.amqp.rabbit.connection.ConnectionFactory;
    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    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;
    
    @Configuration
    public class RabbitConfig {
    
        @Bean(name = "firstConnectionFactory")
        @Primary
        public ConnectionFactory firstConnectionFactory(
                @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
        ) {
            CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
            connectionFactory.setHost(host);
            connectionFactory.setPort(port);
            connectionFactory.setUsername(username);
            connectionFactory.setPassword(password);
            return connectionFactory;
        }
    
        @Bean(name = "secondConnectionFactory")
        public ConnectionFactory secondConnectionFactory(
                @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
        ) {
            CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
            connectionFactory.setHost(host);
            connectionFactory.setPort(port);
            connectionFactory.setUsername(username);
            connectionFactory.setPassword(password);
            return connectionFactory;
        }
    
        @Bean(name = "firstRabbitTemplate")
        @Primary
        public RabbitTemplate firstRabbitTemplate(
                @Qualifier("firstConnectionFactory") ConnectionFactory connectionFactory
        ) {
            RabbitTemplate firstRabbitTemplate = new RabbitTemplate(connectionFactory);
            return firstRabbitTemplate;
        }
    
        @Bean(name = "secondRabbitTemplate")
        public RabbitTemplate secondRabbitTemplate(
                @Qualifier("secondConnectionFactory") ConnectionFactory connectionFactory
        ) {
            RabbitTemplate secondRabbitTemplate = new RabbitTemplate(connectionFactory);
            return secondRabbitTemplate;
        }
    
        @Bean(name = "firstFactory")
        public SimpleRabbitListenerContainerFactory firstFactory(
                SimpleRabbitListenerContainerFactoryConfigurer configurer,
                @Qualifier("firstConnectionFactory") ConnectionFactory connectionFactory
        ) {
            SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
            configurer.configure(factory, connectionFactory);
            return factory;
        }
    
        @Bean(name = "secondFactory")
        public SimpleRabbitListenerContainerFactory secondFactory(
                SimpleRabbitListenerContainerFactoryConfigurer configurer,
                @Qualifier("secondConnectionFactory") ConnectionFactory connectionFactory
        ) {
            SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
            configurer.configure(factory, connectionFactory);
            return factory;
        }
    
        @Bean
        public Queue firstQueue() {
            System.out.println("configuration firstQueue ........................");
            return new Queue("hello1");
        }
    
        @Bean
        public Object secondQueue() {
            System.out.println("configuration secondQueue ........................");
            return new Queue("hello2");
        }
    }
    
    

    RabbitMQ中的消费者,接收first RabbitMQ中的队列hello1的数据

    Receiver.java

    import org.springframework.amqp.rabbit.annotation.RabbitHandler;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Component;
    
    @Component
    @RabbitListener(queues = "hello1", containerFactory = "firstFactory")
    public class Receiver {
    
        @RabbitHandler
        public void process(String hello) {
            System.out.println("Receiver : " + hello);
        }
    
    }
    

    RabbitMQ中的消费者,接收second RabbitMQ中的队列hello2的数据

    Receiver2.java

    import org.springframework.amqp.rabbit.annotation.RabbitHandler;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Component;
    
    @Component
    @RabbitListener(queues = "hello2", containerFactory = "secondFactory")
    public class Receiver2 {
    
        @RabbitHandler
        public void process(String hello) {
            System.out.println("Receiver : " + hello);
        }
    
    }
    

    RabbitMQ中的生产者,发送消息到first RabbitMQ中的队列hello1和hello2

    Sender.java

    import java.util.Date;
    import javax.annotation.Resource;
    
    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    import org.springframework.stereotype.Component;
    
    @Component
    public class Sender {
    
        @Resource(name = "firstRabbitTemplate")
        private RabbitTemplate firstRabbitTemplate;
    
        public void send1() {
            String context = "hello1 " + new Date();
            System.out.println("Sender : " + context);
            this.firstRabbitTemplate.convertAndSend("hello1", context);
        }
    
        public void send2() {
            String context = "hello2 " + new Date();
            System.out.println("Sender : " + context);
            this.firstRabbitTemplate.convertAndSend("hello2", context);
        }
    
    }
    

    RabbitMQ中的生产者,发送消息到second RabbitMQ中的队列hello1和hello2

    Sender2.java

    import java.util.Date;
    import javax.annotation.Resource;
    
    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    import org.springframework.stereotype.Component;
    
    @Component
    public class Sender {
    
        @Resource(name = "firstRabbitTemplate")
        private RabbitTemplate firstRabbitTemplate;
    
        public void send1() {
            String context = "hello1 " + new Date();
            System.out.println("Sender : " + context);
            this.firstRabbitTemplate.convertAndSend("hello1", context);
        }
    
        public void send2() {
            String context = "hello2 " + new Date();
            System.out.println("Sender : " + context);
            this.firstRabbitTemplate.convertAndSend("hello2", context);
        }
    
    }
    

    测试类,调用Sender发送消息

    TestDemo01.java

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.SpringApplicationConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = HelloApplication.class)
    public class TestDemo01 {
    
        @Autowired
        private Sender sender;
    
        @Autowired
        private Sender2 sender2;
    
        @Test
        public void hello() throws Exception {
            sender.send1();
            sender.send2();
        }
    
        @Test
        public void hello2() throws Exception {
            sender2.send1();
            sender2.send2();
        }
    }
    

    运行&测试

    通过运行HelloApplication.Java,将程序中的Receiver启动一直监控着队列,然后通过运行TestDemo01.java中的测试案例,发送消息到队列中,这时可以发现运行HelloApplication的程序控制台将刚刚发送的消息打印出来。

    本文由mdnice多平台发布

    相关文章

      网友评论

          本文标题:Spring Boot 配置多个RabbitMQ

          本文链接:https://www.haomeiwen.com/subject/vhxiwrtx.html