【问题标题】:Spring JMS runtime connection managementSpring JMS 运行时连接管理
【发布时间】:2017-05-14 19:00:45
【问题描述】:

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

在挖掘了有关 Spring、JMS 和 DI 配置的信息后,我了解到这不是满足我需要的最佳方式(也许我错了),因为 DI 不适合像我这样的动态场景。

示例应用流程

应用启动

  • 配置 DB bean
  • 从数据库加载 MQ 配置(URL 列表)
  • (???) 对于每个 MQ 配置:配置 ConnectionFactory -> 进行连接 -> 附加侦听器/端点

应用生命周期

  • 处理 REST 请求
  • 从数据库加载 MQ 配置(URL 列表)
  • (???) 对于每个 MQ 配置:
    • 新项目:配置新的 ConnectionFactory -> 进行连接 -> 附加侦听器/端点
    • 已删除项目:断开连接

【问题讨论】:

    标签: java spring jms spring-jms


    【解决方案1】:

    使用 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 作为具有相关 jndi 的 JndiObjectFactoryBean。这些 bean 是使用自定义范围定义的,然后您可以添加 有条件地在 Scope#get() api 中返回适当的 bean。您可以在 http://javapapers.com/spring/custom-scope-for-spring-bean/

    【讨论】:

    • 抱歉,我不明白配置文件和范围如何帮助我配置和维护未知数量的 MQ 连接。
    【解决方案2】:

    我也做了同样的事情,创建了一个基于属性的 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);
    

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

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

    【讨论】:

    • 抱歉延迟回复,非常感谢,您的解决方案如我所愿!再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-01-06
    • 2018-07-15
    • 2014-04-17
    • 2017-11-24
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 2015-01-17
    相关资源
    最近更新 更多