2016-08-18 2 views
0

Возможно ли каким-либо образом выбрать ресурс JNDI на основе значения переменной, содержащей среду для ссылки?Как выбрать JNDI на основе среды

Например, в моем домене у меня есть 3 среды: DEV, QA и STAGE. У меня есть база данных под названием EcommReporting, которая существует для каждой из этих сред. Чтобы удовлетворить это, в файле server.xml моего сервера tomcat у меня есть отдельные записи для DEV_EcommReporting, QA_EcommReporting и STAGE_EcommReporting.

Вопрос в том, может ли мой код просто запросить ресурс JNDI с именем EcommReporting и предоставить имя среды, а затем, основываясь на этих двух деталях, вернет правильный ресурс?

Вот теперь я определяю источник данных боб с использованием Spring:

<bean id="EcommReportingDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName" value="java:comp/env/jdbc/EcommReporting"/> 
    </bean> 

Затем в context.xml моего сервера Tomcat (только показывает версию QA), у меня есть это:

<ResourceLink name="jdbc/EcommReporting" 
       global="jdbc/QA_EcommReporting" 
       auth="Container" 
       type="javax.sql.DataSource" /> 

И, наконец, в server.xml моего сервера Tomcat, я определил JNDI ресурс следующим образом:

<Resource name="jdbc/QA_EcommReporting" 
     global="jdbc/QA_EcommReporting" 
     auth="Container" 
     type="javax.sql.DataSource" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://URLHERE.COM:3311/REPORTING" 
     username="username_here" 
     password="password_here" 

     maxActive="100" 
     maxIdle="20" 
     minIdle="5" 
     maxWait="10000"/> 

объявления

+0

это не ясно, что вы хотите, у вас есть 3 экземпляра tomcat, и вы хотите иметь доступ к источнику данных, используемому этими 3 экземплярами из другой JVM, это то, что вы хотите? –

ответ

0

Вы можете сделать что-то, используя пружинные профили. Непонятно, что такое точная настройка: звучит, как все 3 WAR разворачиваются на один и тот же сервер? Если это так, вам нужно будет установить активный профиль динамически. Один из способов, который я мог бы подумать, - использовать ServletContextListener и проверить путь к развернутому приложению.

По существу, вы создаете три компонента dataSource и связываете их с определенными профилями. Этот процесс представлен здесь:

https://spring.io/blog/2011/02/11/spring-framework-3-1-m1-released/

<beans profile="dev"> 
    <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/Dev_EcommReporting"/> 
</beans> 
<beans profile="qa"> 
    <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/QA_EcommReporting"/> 
</beans> 

Вы можете создать и установить контекст сервлет активного профиль, основанный на пути.

@Override 
    public void contextInitialized(ServletContextEvent event) { 

     ServletContext context = event.getServletContext(); 

     if(context.getContextPath().equals("/dev"){ 
      servletContext.setInitParameter("spring.profiles.active", "dev"); 
     } else if(context).getCOntextPath().equals("/qa"){ 
      servletContext.setInitParameter("spring.profiles.active", "qa"); 
     } 
    } 

Больше информации здесь:

https://www.mkyong.com/spring/spring-profiles-example/

Если все приложения, развернутые на разных серверах, а затем просто запустить сервер с -Dspring.profiles.active = хуг

Смежные вопросы