簡體   English   中英

Spring JMS運行時連接管理

[英]Spring JMS runtime connection management

我有一個應用程序(基於Spring Boot),該應用程序使用JMS處理消息,並且我需要能夠連接到多個MQ服務器(ActiveMQ)來偵聽消息。 與此相關的另一個問題是,我需要在運行時關閉一些現有連接並向其他服務器添加一些新連接(假設我有一些數據庫來存儲服務器的URL,其余端點通知應用程序重新加載配置(URL)從數據庫並重新配置/刷新當前連接集)。

在了解了有關Spring,JMS和DI配置的信息之后,我了解到這並不是實現所需功能的最佳方法(也許我錯了),因為DI不適用於像我這樣的動態場景。

示例應用流程

應用啟動

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

應用生命周期

  • 處理REST請求
  • 從數據庫加載MQ配置(URL列表)
  • (???)對於每個MQ配置:
    • 新項目:配置新的ConnectionFactory->執行連接->附加偵聽器/端點
    • 刪除的項目:斷開連接

我通過創建一個基於屬性的spring組件來完成上述操作,該組件基於屬性以使用不同的協議連接到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);

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

每個上下文都可以在運行時通過調用close方法關閉並重新創建,因為我將它們保留在主組件的映射中。 通過設置主上下文配置的@ComponentScan ,可以排除此組件無法從主上下文自動加載的情況

有兩種使用Spring實現它的方法。

1. Spring概要文件-您可以維護不同的概要文件,例如MQ1,MQ2,並為每個概要文件使用JNDI配置(JndiObjectFactoryBean)定義bean。 在運行時,根據您的邏輯,您可以通過激活新的配置文件並刷新應用上下文從現有配置文件切換到新的配置文件(和新行為)。 您可以在http://docs.spring.io/autorepo/docs/spring-boot/current/reference/html/boot-features-profiles.html中獲取更多詳細信息

2. Spring自定義范圍和JndiObjectFactoryBean-您可以將所有與MQ相關的bean定義為具有相關jndi的JndiObjectFactoryBean。 這些bean是使用自定義范圍定義的,然后可以在Scope#get()api中添加條件以返回適當的bean。 您可以在http://javapapers.com/spring/custom-scope-for-spring-bean/中獲取更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM