2016-12-30 109 views
0

我有一個使用JMS處理消息的應用程序(基於Spring Boot),我需要能夠連接到多個MQ服務器(ActiveMQ)以偵聽消息。還有一個問題是我需要關閉一些現有的連接,並在運行時向另一臺服務器添加一些新的功能(讓我們想象一下,我有一些存儲服務器URL和休息端點的db,通知應用程序重新加載配置(URL)從數據庫和重新配置/刷新當前連接集)。在我挖掘了關於Spring,JMS和DI配置的信息之後,我明白它不是我需要的最好的方式(也許我錯了),因爲DI不適合像我這樣的動態場景。Spring JMS運行時連接管理

示例應用程序流

應用啓動

  • 配置DB豆從DB
  • 負載MQ配置(URL列表)
  • (???)對於每個MQ config:配置ConnectionFactory - >執行連接 - >附加偵聽器/端點

應用生命週期

  • 手柄REST請求
  • 負載MQ從DB(URL列表)配置
  • (???)對於每個MQ配置:
    • 新item:配置新的ConnectionFactory - >執行連接 - >附加偵聽器/端點
    • 刪除項目:丟棄連接

回答

1

我已經做了通過創建基於性能的彈簧組件連接到型動物主題在不同協議AMQ一樣得到更多的細節。

我通過爲每一個新的上下文,並注入上創建不同的屬性這樣運行了從的重要組成部分組件的多個實例:

Properties source = new Properties(); 
PropertiesPropertySource ps = new PropertiesPropertySource("id", source); 
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(YourConfig.class); 
// I worked with xml context but this is the annotation based context creation 
ctx.getEnvironment().getPropertySources().addLast(ps); 

您可以使用配置類或http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/AnnotationConfigApplicationContext.html#scan-java.lang.String...-設置掃描

每個上下文都可以在運行時通過調用close方法來關閉並重新創建,因爲我將它們保存在主要組件的映射中。 這個組件被排除不能從主要上下文自動加載@ComponentScan的主要上下文配置

+0

對不起,延遲的答覆,非常感謝,您的解決方案按我的意願工作!再次感謝! –

0

有兩種方法可以使用Spring來實現它。

1.彈簧配置文件 -可以維持不同的配置文件,如 MQ1,MQ2並與用於每個輪廓的JNDI配置 (JndiObjectFactoryBean中)限定豆。在運行時,基於邏輯 ,您可以切換到現有的新配置文件(和新行爲) 激活新的配置文件並刷新應用程序上下文。您可以在 http://docs.spring.io/autorepo/docs/spring-boot/current/reference/html/boot-features-profiles.html

2.彈簧定製範圍和JndiObjectFactoryBean來獲得更多的細節 -您可以定義所有 MQ相關豆類的JndiObjectFactoryBean與相關JNDI。這些 bean是使用自定義作用域定義的,然後您可以添加 條件以在Scope#get()api中返回適當的bean。您可以在 http://javapapers.com/spring/custom-scope-for-spring-bean/

+0

抱歉,但我不明白如何配置文件和範圍可以幫助我配置和維護MQ連接的數量未知。 –

+0

我將添加代碼示例以更加精確。 –