2015-06-14 3 views
0

У меня есть компонент интеграции Spring Spring, который я обновляю для работы в частном PCF. У меня есть два источника данных и фабрика соединений RabbitMQ, определенные в приложении.Использование пространства имен весеннего облака и двух источников данных

Я вижу статью Томаса Рисберга об использовании пространства имен облаков и обработке нескольких сервисов за одно и то же время - https://spring.io/blog/2011/11/09/using-cloud-foundry-services-with-spring-part-3-the-cloud-namespace. Это обрабатывается с помощью @Autowired и @Qualifier аннотаций.

Мне интересно, как это можно достичь, если мы не @Autowired и @Qualifier аннотации, например. проводя DataSource в JdbcTemplate. Здесь у нас нет возможности указывать аннотацию @Qualifier.

Мое приложение основано на Spring XML. У меня есть возможность использовать аннотации @Autowired и @Qualifier в одном из DataSources, а другой - менеджер сущностей JPA. См. Фрагмент кода.

Любая помощь очень ценится.

<bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="persistenceUnitName" value="activity-monitor" /> 
     <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/> 
     <property name="jpaProperties"> 
      <value> 
       hibernate.format_sql=true 
      </value> 
     </property> 
    </bean> 

    <beans profile="cloud"> 
     <cloud:data-source id="dataSource" service-name="actmon-db-service" /> 
    </beans> 

Java Build Pack: java_buildpack_offline java-buildpack-offline-v2.4.zip Spring Auto-реконфигурации версии 1.4.0.

ОБНОВЛЕНИЕ: Это полная конфигурация для обоих источников данных, включая PropertySourcesPlaceholderConfigurer с свойствами, загружаемыми из источника данных с использованием DAO.

<bean id="cic.application.ppc" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> 
    <property name="properties" ref="cic.application.properties"/> 
    <property name="locations" ref="cic.application.propertyLocations"/> 
</bean> 

<bean id="cic.application.properties" class="java.util.Properties"> 
    <constructor-arg value="#{cicPropertiesService.properties}"></constructor-arg> 
</bean> 

<bean id="cic.properties.propertiesService" name="cicPropertiesService" 
    class="com.emc.it.eis.properties.service.DefaultPropertiesService"> 
    <constructor-arg index="0" 
     ref="cic.properties.propertiesDao" /> 
</bean> 

<bean id="cic.properties.propertiesDao" class="com.emc.it.eis.properties.dao.JdbcPropertiesDao"> 
    <constructor-arg ref="cic.properties.dataSource" /> 
</bean> 

<beans profile="default"> 
    <jee:jndi-lookup id="cic.properties.dataSource" 
     jndi-name="jdbc/intdb" /> 
</beans> 

<beans profile="cloud"> 
    <cloud:data-source id="cic.properties.dataSource" service-name="oracle-cicadm-db-service" /> 
</beans> 

<beans> 
    <bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="actmonDataSource" /> 
     <property name="persistenceUnitName" value="activity-monitor" /> 
     <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/> 
     <property name="jpaProperties"> 
      <value> 
       hibernate.format_sql=true 
      </value> 
     </property> 
    </bean> 

    <bean id="transactionManager" 
     class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 
</beans> 

<beans profile="default"> 
    <jee:jndi-lookup id="dataSource" 
     jndi-name="jdbc/actmon" /> 
</beans> 

<beans profile="cloud"> 
    <cloud:data-source id="actmonDataSource" service-name="postgres-actmon-db-service" /> 
</beans> 

<beans profile="default,cloud"> 
    <bean id="jpaVendorAdapter" 
     class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="database" value="POSTGRESQL" /> 
    </bean> 
</beans> 

Выход из CF при развертывании https://gist.github.com/anonymous/3986a1a7cea4f20c096e. Обратите внимание, что пропускается автоматическая переконфигурация javax.sql.DataSources

+0

Автоматическая реконфигурация связанных служб в приложениях Spring доступна только в том случае, если у вас есть одна служба определенного типа, привязанная к вашему приложению. См. Http://docs.cloudfoundry.org/buildpacks/java/spring-service-bindings.html#auto. В этом случае вы вручную настраиваете источники данных, поэтому автоматическая переконфигурация не нужна. Если у вас несколько привязанных баз данных, автоконфигурация не знает, для какой границы db следует использовать для этой цели. –

+0

Вы уверены, что профиль «облака» активируется при нажатии вашего приложения? Некоторые версии Java buildpack автоматически не активировали этот профиль во всех случаях. Попробуйте запустить 'cf set-env appname SPRING_PROFILES_ACTIVE cloud', чтобы убедиться. –

+0

Спасибо. Документы делают это немного яснее. Я думал, что автоматическая переконфигурация и пружинные разъемы были связаны друг с другом.Ручная настройка подразумевает весеннее облако. Поэтому для нескольких источников данных в рекомендациях в документах указывается, что для аннотации @Qualifier следует различать. Журнал показывает, что профиль облака активируется. –

ответ

0

Прежде всего, сообщение от Томаса довольно старое и ссылается на устаревшую библиотеку поддержки. Вместо зависимости org.cloudfoundry:cloudfoundry-runtime:0.8.1 вместо этого вы должны использовать Spring Cloud Connectors dependencies.

Затем вы можете использовать instructions provided для использования конфигурации XML с помощью Spring Cloud Connectors. При использовании нескольких сервисов одного типа вам нужно будет указать имя службы для каждого компонента. Следуя вашему примеру, и если вы создали две CF службы базы данных с именем inventory-db и customer-db, что может выглядеть примерно так:

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="inventory-dataSource" /> 
    <property name="persistenceUnitName" value="activity-monitor" /> 
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/> 
    <property name="jpaProperties"> 
     <value> 
      hibernate.format_sql=true 
     </value> 
    </property> 
</bean> 

<beans profile="cloud"> 
    <cloud:data-source id="inventory-dataSource" service-name="inventory-db"> 
    <cloud:data-source id="customer-dataSource" service-name="customer-db"> 
</beans> 
+0

Hi Scott. Отредактировал мой вопрос с дополнительной информацией. К сожалению, ссылка на этот пост была обнаружена мной. Я фактически не использую эти библиотеки. Я использую последние версии GA разъемов весеннего облака. –

+0

Нет проблем, я не был уверен, что вы использовали более старые библиотеки или нет, просто хотел убедиться. –

0

мне удалось решить эту проблему, используя заводскую боб, используемый весеннем облака: источник данных, CloudDataSourceFactory. Создание экземпляра этого и подключение конфигурации, включая service-name службы CF. Это позволяет избежать проблемы с нашим PropertySourcesPlaceholderConfigurer, пытающимся использовать источник данных, прежде чем наш компонент будет определен.

<!-- 
     configure cloud data source for using CloudDataSourceFactory; this is what spring cloud:data-source is using; 
     required to manually wire this data source bean as cloud:data-source bean gets defined in a phase after our 
     PropertySourcesPlaceholderConfigurer bean. 
    --> 
    <bean id="cic.properties.dataSource" class="org.springframework.cloud.service.relational.CloudDataSourceFactory"> 
     <constructor-arg value="oracle-cicadm-db-service" /> 
     <constructor-arg> 
      <!-- configuring minimal data source as it is used only to bootstrap properties on app start-up --> 
      <bean class="org.springframework.cloud.service.relational.DataSourceConfig"> 
       <constructor-arg> 
        <bean class="org.springframework.cloud.service.PooledServiceConnectorConfig.PoolConfig"> 
         <constructor-arg value="0" /> 
         <constructor-arg value="2" /> 
         <constructor-arg value="180" /> 
        </bean> 
       </constructor-arg> 
       <!-- ConnectionConfig not required for cic.properties.dataSource so setting to null --> 
       <constructor-arg value="#{ null }" /> 
      </bean> 
     </constructor-arg> 
    </bean> 
Смежные вопросы