spring boot rabbitmq 多MQ配置 自動 創建 隊列 RPC


源碼地址:https://github.com/hutuchong518/RabbitmqStudy

 

需求:   spring boot 整合 rabbitmq rpc功能, 需要將 請求和響應 這兩個隊列 分別放在不同的MQ服務器上,以提高單個MQ服務器的吞吐量和性能。

 

MQ服務器1:  

      IP:192.168.179.128

     對列:hello1

    

MQ服務器2:  

      IP:172.16.16.218

     對列:hello2

 

這里實現的關鍵 是  創建隊列 到 指定 MQ服務器中, 網上一些文章 都是 一把輪 沒有區分,在實施上有問題的其實,這里通過實踐並解決,以供參考。

 

下面是代碼:

 

  1 package com.mq.util;
  2 
  3 
  4 import com.rabbitmq.client.AMQP;
  5 import com.rabbitmq.client.Channel;
  6 import org.springframework.amqp.core.Queue;
  7 import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
  8 import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
  9 import org.springframework.amqp.rabbit.connection.Connection;
 10 import org.springframework.amqp.rabbit.connection.ConnectionFactory;
 11 import org.springframework.amqp.rabbit.core.RabbitTemplate;
 12 import org.springframework.beans.factory.annotation.Qualifier;
 13 import org.springframework.beans.factory.annotation.Value;
 14 import org.springframework.beans.factory.config.ConfigurableBeanFactory;
 15 import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
 16 import org.springframework.context.annotation.Bean;
 17 import org.springframework.context.annotation.Configuration;
 18 import org.springframework.context.annotation.Primary;
 19 import org.springframework.context.annotation.Scope;
 20 
 21 import java.io.IOException;
 22 
 23 
 24 @Configuration
 25 public class RabbitConfig {
 26 
 27     @Bean(name = "firstConnectionFactory")
 28     @Primary
 29     public ConnectionFactory firstConnectionFactory(
 30             @Value("${spring.rabbitmq.first.host}") String host,
 31             @Value("${spring.rabbitmq.first.port}") int port,
 32             @Value("${spring.rabbitmq.first.username}") String username,
 33             @Value("${spring.rabbitmq.first.password}") String password
 34     ) {
 35         CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
 36         connectionFactory.setHost(host);
 37         connectionFactory.setPort(port);
 38         connectionFactory.setUsername(username);
 39         connectionFactory.setPassword(password);
 40         return connectionFactory;
 41     }
 42 
 43     @Bean(name = "secondConnectionFactory")
 44     public ConnectionFactory secondConnectionFactory(
 45             @Value("${spring.rabbitmq.second.host}") String host,
 46             @Value("${spring.rabbitmq.second.port}") int port,
 47             @Value("${spring.rabbitmq.second.username}") String username,
 48             @Value("${spring.rabbitmq.second.password}") String password
 49     ) {
 50         CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
 51         connectionFactory.setHost(host);
 52         connectionFactory.setPort(port);
 53         connectionFactory.setUsername(username);
 54         connectionFactory.setPassword(password);
 55         return connectionFactory;
 56     }
 57 
 58     @Bean(name = "firstRabbitTemplate")
 59     //@Primary  //貌似沒用,移除
 60     @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)//必須是prototype類型
 61     public RabbitTemplate firstRabbitTemplate(
 62             @Qualifier("firstConnectionFactory") ConnectionFactory connectionFactory
 63     ) {
 64         RabbitTemplate firstRabbitTemplate = new RabbitTemplate(connectionFactory);
 65         return firstRabbitTemplate;
 66     }
 67 
 68     @Bean(name = "secondRabbitTemplate")
 69     public RabbitTemplate secondRabbitTemplate(
 70             @Qualifier("secondConnectionFactory") ConnectionFactory connectionFactory
 71     ) {
 72         RabbitTemplate secondRabbitTemplate = new RabbitTemplate(connectionFactory);
 73         return secondRabbitTemplate;
 74     }
 75 
 76     @Bean(name = "firstFactory")
 77     public SimpleRabbitListenerContainerFactory firstFactory(
 78             SimpleRabbitListenerContainerFactoryConfigurer configurer,
 79             @Qualifier("firstConnectionFactory") ConnectionFactory connectionFactory
 80     ) {
 81         SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
 82         configurer.configure(factory, connectionFactory);
 83         return factory;
 84     }
 85 
 86     @Bean(name = "secondFactory")
 87     public SimpleRabbitListenerContainerFactory secondFactory(
 88             SimpleRabbitListenerContainerFactoryConfigurer configurer,
 89             @Qualifier("secondConnectionFactory") ConnectionFactory connectionFactory
 90     ) {
 91         SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
 92         configurer.configure(factory, connectionFactory);
 93         return factory;
 94     }
 95 
 96     @Bean
 97     public void runFirstQueue(@Qualifier("firstConnectionFactory") ConnectionFactory connectionFactory) {
 98         System.out.println("configuration firstQueue ........................");
 99         //return new Queue("hello1");
100         Connection connection = connectionFactory.createConnection();
101         Channel channel = connection.createChannel(false);
102         try {
103             channel.queueDeclare("hello1", false, false, false, null);
104             channel.queueBind("hello1", "exchange1", "hello.#");
105         } catch (Exception e) {
106             e.printStackTrace();
107         }
108     }
109 
110     @Bean
111     public void runSecondQueue(@Qualifier("secondConnectionFactory") ConnectionFactory connectionFactory) {
112         System.out.println("configuration secondQueue ........................");
113         //return new Queue("hello2");
114         Connection connection = connectionFactory.createConnection();
115         Channel channel = connection.createChannel(false);
116         try {
117             channel.queueDeclare("hello2", false, false, false, null);
118             channel.queueBind("hello2", "exchange2", "hello.#");
119         } catch (Exception e) {
120             e.printStackTrace();
121         }
122     }
123 
124 
125     //下面2個對列創建方式 測試后發現不是 針對指定mq 服務器創建,只會在第一個服務器創建
126     /*
127     @Bean
128     public Queue firstQueue() {
129         System.out.println("configuration firstQueue ........................");
130         return new Queue("hello1");
131     }
132 
133     @Bean
134     public Object secondQueue() {
135         System.out.println("configuration secondQueue ........................");
136         return new Queue("hello2");
137     }
138     */
139 }

 

 

參考:https://www.cnblogs.com/hutuchong/p/7443252.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM