如何根据环境

时间:2016-08-18 17:35:04

标签: java xml spring tomcat jndi

是否有可能根据包含要链接到哪个环境的变量的值来选择JNDI资源?

例如,在我的域中,我有3个环境:DEV,QA和STAGE。我有一个名为EcommReporting的数据库,它存在于每个环境中。为了满足这一需求,在我的tomcat服务器的server.xml文件中,我有DEV_EcommReportingQA_EcommReportingSTAGE_EcommReporting的单独条目。

问题是,我的代码是否可以通过某种方式请求名为EcommReporting的JNDI资源并提供环境名称,然后根据这两个详细信息返回正确的资源?

现在我在使用Spring定义数据源bean:

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

然后在我的Tomcat服务器的context.xml中(仅显示QA版本),我有:

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

最后,在我的Tomcat服务器的server.xml中,我已经按如下方式定义了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"/>

广告

1 个答案:

答案 0 :(得分:0)

您可以使用Spring配置文件执行某些操作。目前还不清楚确切的设置是什么:声音像所有3个WAR被部署到同一个服务器?如果是这样,您需要动态设置活动配置文件。我能想到的一种方法是使用ServletContextListener并检查已部署应用程序的路径。

基本上,您可以创建三个dataSource bean并将它们与特定的配置文件相关联。这个过程概述如下:

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>

然后,您可以创建ServletContextListener并根据路径设置活动配置文件。

    @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 = xyz启动服务器