代码之家  ›  专栏  ›  技术社区  ›  Justin

主机/角色相关弹簧配置

  •  1
  • Justin  · 技术社区  · 15 年前

    我有一个运行Spring应用程序的服务器集群。一些Spring组件需要根据其服务器所扮演的角色(主要、次要等)进行不同的配置。我不想为每个角色维护单独的Spring配置文件,而是希望在应用程序启动时动态地检测到这一点。它几乎就像我想要条件bean实例化(这在春天是不存在的)。

    问: 实现这种配置的最佳方法是什么?

    例子: 只有集群中的主节点才能创建对JMS代理的持久订阅(这需要全局唯一的JMS客户端ID)。我可以通过在数据库中查找正在运行的服务器的主机名来检测当前主机是否具有此角色,并手动启动此容器(如果我的节点恰好是主节点);但是,我不希望群集中的每个节点都创建持久订阅(通过实例化此bean)。

    <bean id="auditrecordListenerContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="concurrentConsumers" value="1" />
        <property name="clientID" value="${server-hostname}" />
        <property name="durable" value="true" />
    
        <!-- only started on the primary node: via application listener -->
        <property name="autoStartup" value="false" />
    </bean>
    

    但是请注意,Spring容器中没有$server hostname属性(至少我知道)。

    2 回复  |  直到 12 年前
        1
  •  1
  •   flicken    15 年前

    如果您的代码已经根据对象属性有条件地启动了适当的服务,那么可以按以下方式使用实用工具方法:

    <!-- Factory methods to determine properties -->
    <bean id="hostname" class="MyUtil" factory-method="determineHostName"/>
    <bean id="isHost" class="MyUtil" factory-method="isHost"/>
    
    
    <bean id="auditrecordListenerContainer"
      class="org.springframework.jms.listener.DefaultMessageListenerContainer">
      <property name="concurrentConsumers" value="1" />
      <property name="durable" value="true" />
    
      <!-- Reference properties here -->
      <property name="hostname" ref="hostname" /> 
      <property name="autoStartup" ref="isHost" />
    </bean>
    

    要使用singleton bean的属性,请使用 PropertyPathFactoryBean :

    <bean id="config" class="MyConfig"/>
    <util:property-path id="hostname" path="config.hostname"/>
    <util:property-path id="isHost" path="config.host"/>
    
        2
  •  1
  •   axtavt    15 年前

    可以实现条件实例化逻辑 作为一个 FactoryBean