конфигурация пружины в зависимости от хоста / роли - PullRequest
1 голос
/ 20 января 2010

У меня есть кластер серверов, на которых запущено весеннее приложение. Некоторые пружинные компоненты должны быть настроены по-разному в зависимости от роли, которую играет их сервер (основной, дополнительный и т. Д.). Я не хочу поддерживать отдельные весенние конфигурационные файлы для каждой роли, а хочу динамически определять это при запуске приложения. Это почти как если бы я хотел создать экземпляр условного компонента (которого не существует весной).

Q: Каков наилучший способ настройки этого типа конфигурации?

Пример: Только основной узел в кластере должен создавать долговременную подписку для JMS-брокера (для которого требуется глобально уникальный JID clientID). Я могу определить, имеет ли текущий хост эту роль, посмотрев имя хоста работающего сервера в базе данных, и запустить этот контейнер вручную (если мой узел оказался основным); однако я не хочу, чтобы каждый узел в кластере создавал долговременную подписку (путем создания экземпляра этого компонента).

<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 ]

1 голос
/ 20 января 2010

Если ваш код уже условно запускает соответствующие службы на основе свойств объекта, вы можете использовать служебные методы следующим образом:

<!-- 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>

Чтобы вместо этого использовать свойство одноэлементного компонента, используйте PropertyPathFactoryBean :

<bean id="config" class="MyConfig"/>
<util:property-path id="hostname" path="config.hostname"/>
<util:property-path id="isHost" path="config.host"/>
1 голос
/ 20 января 2010

Вы можете реализовать логику условного создания как FactoryBean

...