我有一个应用程序(基于 Spring Boot),它使用 JMS 来处理消息,并且我需要能够连接到多个 MQ 服务器(ActiveMQ)来监听消息。另一个问题是我需要关闭一些现有连接并在运行时向另一台服务器添加一些新连接(假设我有一些数据库存储服务器的 URL 和通知应用程序重新加载配置(URL)的休息端点从数据库并重新配置/刷新当前连接集)。
在挖掘了有关 Spring、JMS 和 DI 配置的信息后,我明白这不是完成我需要的操作的最佳方式(也许我错了),因为 DI 不太适合像我这样的动态场景。
示例应用流程
应用程序启动
- 配置数据库 bean
- 从数据库加载 MQ 配置(URL 列表)
- (???) 对于每个 MQ 配置:配置 ConnectionFactory -> 进行连接 -> 附加监听器/端点
应用生命周期
- 处理 REST 请求
- 从数据库加载 MQ 配置(URL 列表)
- (???) 对于每个 MQ 配置:
- 新项目:配置新的 ConnectionFactory -> 进行连接 -> 附加监听器/端点
- 已删除项目:断开连接
最佳答案
我通过创建一个 Spring 组件来完成相同的操作,该组件基于属性以使用不同协议(protocol)连接到 AMQ 上的不同主题。
我通过为每个实例创建一个新的上下文并在创建时注入(inject)不同的属性,从主组件运行该组件的多个实例,如下所示:
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
,该组件被排除在外,不会自动从主上下文加载
关于java - Spring JMS 运行时连接管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41396870/