我有一个应用程序(基于Spring Boot),它使用JMS处理消息,我需要能够连接到多个MQ服务器(ActiveMQ)来监听消息。另一个问题是我需要关闭一些现有连接并在运行时向其他服务器添加一些新服务(让我们假设我有一些存储服务器和休息端点的URL的数据库通知应用程序重新加载配置(URL)来自db并重新配置/刷新当前连接集。)
在挖掘了有关Spring,JMS和DI配置的信息之后,我明白这不是我需要的最佳方式(也许我错了),因为DI不适合像我这样的动态场景。
示例应用流程
应用开始
应用生命周期
答案 0 :(得分:1)
我通过创建一个基于属性的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
答案 1 :(得分:0)
有两种方法可以使用Spring实现它。
<强> 1。 Spring配置文件 - 您可以维护不同的配置文件,例如 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是使用自定义范围定义的,然后您可以添加 条件是在Scope#get()api中返回适当的bean。你可以在这里获得更多细节 http://javapapers.com/spring/custom-scope-for-spring-bean/