最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot多RabbitMQ連接集成的實現(xiàn)示例

 更新時間:2026年02月06日 09:32:41   作者:Zerophyr  
本文介紹了如何在SpringBoot應(yīng)用中優(yōu)雅地處理多個RabbitMQ連接的問題,避免配置沖突,通過自定義ConnectionFactory、RabbitTemplate和ListenerContainerFactoryBean,并使用@Qualifier注解進行Bean隔離,感興趣的可以了解一下

問題背景

在企業(yè)級開發(fā)中,我們經(jīng)常遇到這樣的場景:系統(tǒng)已經(jīng)使用了自己的 RabbitMQ 處理核心業(yè)務(wù),但又需要對接第三方系統(tǒng)的 RabbitMQ。由于 Spring Boot 默認只支持單個 RabbitMQ 連接配置,直接添加第二個連接會導(dǎo)致配置沖突。

本文將詳細介紹如何優(yōu)雅地解決這個問題。

核心思路

Spring Boot 默認只支持單個 RabbitMQ 連接,當需要對接多個 RabbitMQ 時,核心思路是:

  1. 保留默認配置:主業(yè)務(wù)繼續(xù)使用 Spring Boot 的默認 RabbitMQ 配置
  2. 自定義額外連接:為每個額外的 RabbitMQ 創(chuàng)建獨立的 ConnectionFactory、RabbitTemplate 和 ListenerContainerFactory
  3. Bean 隔離:使用 @Qualifier 注解區(qū)分不同的 RabbitMQ Bean
  4. 指定連接源:在發(fā)送消息和監(jiān)聽消息時明確指定使用哪個 RabbitMQ 連接

實戰(zhàn)案例:對接兩個 RabbitMQ

假設(shè)我們的系統(tǒng)需要:

  • 主 RabbitMQ:處理核心業(yè)務(wù)消息
  • 第三方 RabbitMQ:對接外部系統(tǒng)消息

1. 配置文件

# 主 RabbitMQ(默認)
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: admin
    password: admin123
    virtual-host: /

# 第三方 RabbitMQ
third-party:
  rabbitmq:
    host: 192.168.1.100
    port: 5672
    username: guest
    password: guest
    virtual-host: /external

2. 第三方 RabbitMQ 配置類

@Configuration
@ConfigurationProperties(prefix = "third-party.rabbitmq")
@Data
public class ThirdPartyRabbitConfig {
    
    private String host;
    private int port;
    private String username;
    private String password;
    private String virtualHost;
    
    /**
     * 第三方 RabbitMQ 連接工廠
     */
    @Bean("thirdPartyConnectionFactory")
    public ConnectionFactory thirdPartyConnectionFactory() {
        CachingConnectionFactory factory = new CachingConnectionFactory();
        factory.setHost(host);
        factory.setPort(port);
        factory.setUsername(username);
        factory.setPassword(password);
        factory.setVirtualHost(virtualHost);
        return factory;
    }
    
    /**
     * 第三方 RabbitMQ 發(fā)送模板
     */
    @Bean("thirdPartyRabbitTemplate")
    public RabbitTemplate thirdPartyRabbitTemplate(
            @Qualifier("thirdPartyConnectionFactory") ConnectionFactory connectionFactory) {
        return new RabbitTemplate(connectionFactory);
    }
    
    /**
     * 第三方 RabbitMQ 監(jiān)聽器工廠
     */
    @Bean("thirdPartyListenerFactory")
    public SimpleRabbitListenerContainerFactory thirdPartyListenerFactory(
            @Qualifier("thirdPartyConnectionFactory") ConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        return factory;
    }
}

3. 消息發(fā)送:指定不同的 RabbitMQ

@Service
@Slf4j
public class MessageSender {

    // 主 RabbitMQ(默認)
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    // 第三方 RabbitMQ
    @Autowired
    @Qualifier("thirdPartyRabbitTemplate")
    private RabbitTemplate thirdPartyRabbitTemplate;

    /**
     * 發(fā)送到主 RabbitMQ
     */
    public void sendToMain(String exchange, String routingKey, Object message) {
        rabbitTemplate.convertAndSend(exchange, routingKey, message);
        log.info("發(fā)送到主RabbitMQ: {}", message);
    }

    /**
     * 發(fā)送到第三方 RabbitMQ
     */
    public void sendToThirdParty(String exchange, String routingKey, Object message) {
        thirdPartyRabbitTemplate.convertAndSend(exchange, routingKey, message);
        log.info("發(fā)送到第三方RabbitMQ: {}", message);
    }
}

4. 消息監(jiān)聽:指定不同的 RabbitMQ

@Component
@Slf4j
public class MessageListener {

    /**
     * 監(jiān)聽主 RabbitMQ(使用默認工廠)
     */
    @RabbitListener(queues = "main.queue")
    public void handleMainMessage(String message) {
        log.info("收到主系統(tǒng)消息: {}", message);
        // 處理主業(yè)務(wù)邏輯
    }

    /**
     * 監(jiān)聽第三方 RabbitMQ(指定工廠)
     */
    @RabbitListener(
        queues = "external.queue",
        containerFactory = "thirdPartyListenerFactory"  // 關(guān)鍵:指定監(jiān)聽器工廠
    )
    public void handleThirdPartyMessage(String message) {
        log.info("收到第三方消息: {}", message);
        // 處理第三方消息
    }
}

5. 使用示例

@RestController
public class TestController {

    @Autowired
    private MessageSender messageSender;

    @PostMapping("/send-main")
    public String sendToMain() {
        messageSender.sendToMain("main.exchange", "main.key", "Hello Main!");
        return "發(fā)送到主RabbitMQ成功";
    }

    @PostMapping("/send-third-party")
    public String sendToThirdParty() {
        messageSender.sendToThirdParty("external.exchange", "external.key", "Hello External!");
        return "發(fā)送到第三方RabbitMQ成功";
    }
}

核心要點

  1. Bean 命名:為每個額外的 RabbitMQ 連接創(chuàng)建帶前綴的 Bean(如 thirdPartyConnectionFactory)
  2. 發(fā)送消息:注入對應(yīng)的 RabbitTemplate,使用 @Qualifier 區(qū)分
  3. 監(jiān)聽消息:在 @RabbitListener 中指定 containerFactory 參數(shù)
  4. 配置隔離:每個 RabbitMQ 使用獨立的配置,互不影響

擴展到更多 RabbitMQ

如果需要對接更多 RabbitMQ,按照相同模式:

  1. 在配置文件中添加新的連接參數(shù)
  2. 創(chuàng)建新的配置類,定義 ConnectionFactory、RabbitTemplate、ListenerContainerFactory
  3. 在代碼中使用 @Qualifier 指定具體的 Bean

這樣可以在一個 Spring Boot 應(yīng)用中同時連接任意數(shù)量的 RabbitMQ 實例,每個連接完全獨立,互不干擾。

實際應(yīng)用場景

  • 多租戶系統(tǒng):不同租戶使用不同的 RabbitMQ 實例
  • 第三方集成:對接外部供應(yīng)商的消息隊列系統(tǒng)
  • 環(huán)境隔離:開發(fā)、測試、生產(chǎn)環(huán)境使用不同的 RabbitMQ
  • 業(yè)務(wù)隔離:核心業(yè)務(wù)和日志、監(jiān)控使用獨立的消息隊列

總結(jié)

通過本文介紹的方法,我們可以輕松解決 Spring Boot 應(yīng)用中多 RabbitMQ 連接的問題。關(guān)鍵在于理解 Spring 的 Bean 管理機制,合理使用 @Qualifier 注解進行 Bean 隔離,確保每個 RabbitMQ 連接獨立工作。

這種方案具有良好的擴展性,可以根據(jù)實際業(yè)務(wù)需求靈活添加更多的 RabbitMQ 連接,是企業(yè)級應(yīng)用中處理多消息隊列集成的最佳實踐。

到此這篇關(guān)于SpringBoot多RabbitMQ連接集成的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot多RabbitMQ連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于Long和Integer相互轉(zhuǎn)換方式

    關(guān)于Long和Integer相互轉(zhuǎn)換方式

    這篇文章主要介紹了關(guān)于Long和Integer相互轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • logback和log4j日志框架堆棧信息添加TraceId方式

    logback和log4j日志框架堆棧信息添加TraceId方式

    這篇文章主要介紹了logback和log4j日志框架堆棧信息添加TraceId方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • mybatis-plus之如何根據(jù)數(shù)據(jù)庫主鍵定義字段類型

    mybatis-plus之如何根據(jù)數(shù)據(jù)庫主鍵定義字段類型

    這篇文章主要介紹了mybatis-plus之如何根據(jù)數(shù)據(jù)庫主鍵定義字段類型問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 詳解Java語言中的抽象類與繼承

    詳解Java語言中的抽象類與繼承

    這篇文章主要為大家詳細介紹了Java語言中的抽象類與繼承的相關(guān)資料,文中的示例代碼講解詳細,對我們學(xué)習(xí)Java有一定的幫助,感興趣的小伙伴快跟隨小編一起了解一下
    2022-10-10
  • Java倒計時三種實現(xiàn)方式代碼實例

    Java倒計時三種實現(xiàn)方式代碼實例

    這篇文章主要介紹了Java倒計時三種實現(xiàn)方式代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Java中的對象和引用詳解

    Java中的對象和引用詳解

    這篇文章主要介紹了Java中的對象和引用詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Java編譯期常量與運行時常量的區(qū)別詳解

    Java編譯期常量與運行時常量的區(qū)別詳解

    在Java開發(fā)中,常量是我們每天都會接觸的概念,從接口超時時間、業(yè)務(wù)枚舉值,到全局配置參數(shù),常量的合理使用能提升代碼可讀性、可維護性,甚至優(yōu)化程序性能,但很多同學(xué)只知道用final修飾常量,卻分不清「編譯期常量」和「運行時常量」的本質(zhì)區(qū)別,本文給大家詳細說說
    2026-05-05
  • springboot整合netty框架的方式小結(jié)

    springboot整合netty框架的方式小結(jié)

    Netty 是一個基于NIO的客戶、服務(wù)器端編程框架,使用Netty 可以確保你快速和簡單的開發(fā)出一個網(wǎng)絡(luò)應(yīng)用,這篇文章主要介紹了springboot整合netty框架的方式小結(jié),需要的朋友可以參考下
    2022-06-06
  • Spring Security 7 響應(yīng)頭配置方法及其解決方案

    Spring Security 7 響應(yīng)頭配置方法及其解決方案

    本文詳細介紹了Spring Security中的HTTP安全響應(yīng)頭配置方法,重點分析了X-Frame-Options響應(yīng)頭沖突問題及其解決方案,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • Spring Aop如何給Advice傳遞參數(shù)

    Spring Aop如何給Advice傳遞參數(shù)

    這篇文章主要介紹了Spring Aop如何給Advice傳遞參數(shù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11

最新評論

台湾省| 海兴县| 华池县| 万宁市| 霸州市| 怀柔区| 迁西县| 乳源| 阿拉尔市| 土默特左旗| 包头市| 怀来县| 靖边县| 天水市| 甘孜| 晋宁县| 丽江市| 广南县| 黔西县| 会泽县| 明光市| 苏尼特右旗| 张掖市| 于都县| 乾安县| 松潘县| 冷水江市| 兴安县| 永康市| 丹东市| 新兴县| 龙泉市| 秀山| 潜江市| 武汉市| 东海县| 泸州市| 横峰县| 手机| 保康县| 理塘县|