Spring JMS 运行时连接管理

Spring JMS runtime connection management

我有一个应用程序(Spring 基于引导)使用 JMS 来处理消息,我需要能够连接到多个 MQ 服务器 (ActiveMQ) 以侦听消息。另一个问题是我需要关闭一些现有连接并在 运行 时间向另一台服务器添加一些新连接(假设我有一些数据库存储服务器的 URL 和通知应用程序重新加载的休息端点来自 db 的配置(URL)和 reconfigure/refresh 当前连接集)。

在挖掘有关 Spring、JMS 和 DI 配置的信息后,我明白这不是做我需要的最好方法(也许我错了),因为 DI 不适合动态像我这样的场景。

示例应用流程

应用启动

应用程序生命周期

有两种方法可以使用 Spring。

1. Spring profiles - 您可以维护不同的配置文件,例如 MQ1、MQ2 并使用 JNDI 配置定义 bean (JndiObjectFactoryBean) 为每个配置文件。在 运行 时间,基于 根据您的逻辑,您可以通过以下方式从现有配置文件切换到新配置文件(和新行为) 激活新配置文件并刷新应用上下文。您可以在此处获取更多详细信息 http://docs.spring.io/autorepo/docs/spring-boot/current/reference/html/boot-features-profiles.html

2。 Spring自定义范围和JndiObjectFactoryBean -你可以定义所有 MQ 相关 bean 作为 JndiObjectFactoryBean 与相关的 jndi。这些 bean是使用自定义范围定义的,然后您可以添加 以 return Scope#get() api 中的适当 bean 为条件。您可以在此处获取更多详细信息 http://javapapers.com/spring/custom-scope-for-spring-bean/

我通过创建一个 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);

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

设置扫描

每个上下文都可以在 运行 时间通过调用 close 方法关闭并重新创建,因为我将它们保存在主组件的映射中。 通过设置主上下文配置的 @ComponentScan

,该组件被排除在外,不会自动从主上下文加载