Spring JMS 运行时连接管理
Spring JMS runtime connection management
我有一个应用程序(Spring 基于引导)使用 JMS 来处理消息,我需要能够连接到多个 MQ 服务器 (ActiveMQ) 以侦听消息。另一个问题是我需要关闭一些现有连接并在 运行 时间向另一台服务器添加一些新连接(假设我有一些数据库存储服务器的 URL 和通知应用程序重新加载的休息端点来自 db 的配置(URL)和 reconfigure/refresh 当前连接集)。
在挖掘有关 Spring、JMS 和 DI 配置的信息后,我明白这不是做我需要的最好方法(也许我错了),因为 DI 不适合动态像我这样的场景。
示例应用流程
应用启动
- 配置数据库 bean
- 从数据库(URL 列表)加载 MQ 配置
- (???) 对于每个 MQ 配置:配置 ConnectionFactory -> 进行连接 -> 附加 listeners/endpoints
应用程序生命周期
- 处理 REST 请求
- 从数据库(URL 列表)加载 MQ 配置
- (???) 对于每个 MQ 配置:
- 新项目:配置新的 ConnectionFactory -> 建立连接 -> 附加 listeners/endpoints
- 已删除项目:断开连接
有两种方法可以使用 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);
设置扫描
每个上下文都可以在 运行 时间通过调用 close 方法关闭并重新创建,因为我将它们保存在主组件的映射中。
通过设置主上下文配置的 @ComponentScan
,该组件被排除在外,不会自动从主上下文加载
我有一个应用程序(Spring 基于引导)使用 JMS 来处理消息,我需要能够连接到多个 MQ 服务器 (ActiveMQ) 以侦听消息。另一个问题是我需要关闭一些现有连接并在 运行 时间向另一台服务器添加一些新连接(假设我有一些数据库存储服务器的 URL 和通知应用程序重新加载的休息端点来自 db 的配置(URL)和 reconfigure/refresh 当前连接集)。
在挖掘有关 Spring、JMS 和 DI 配置的信息后,我明白这不是做我需要的最好方法(也许我错了),因为 DI 不适合动态像我这样的场景。
示例应用流程
应用启动
- 配置数据库 bean
- 从数据库(URL 列表)加载 MQ 配置
- (???) 对于每个 MQ 配置:配置 ConnectionFactory -> 进行连接 -> 附加 listeners/endpoints
应用程序生命周期
- 处理 REST 请求
- 从数据库(URL 列表)加载 MQ 配置
- (???) 对于每个 MQ 配置:
- 新项目:配置新的 ConnectionFactory -> 建立连接 -> 附加 listeners/endpoints
- 已删除项目:断开连接
有两种方法可以使用 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);
设置扫描
每个上下文都可以在 运行 时间通过调用 close 方法关闭并重新创建,因为我将它们保存在主组件的映射中。
通过设置主上下文配置的 @ComponentScan