是否有可能根据包含要链接到哪个环境的变量的值来选择JNDI资源?
例如,在我的域中,我有3个环境:DEV,QA和STAGE。我有一个名为EcommReporting的数据库,它存在于每个环境中。为了满足这一需求,在我的tomcat服务器的server.xml
文件中,我有DEV_EcommReporting
,QA_EcommReporting
和STAGE_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"/>
广告
答案 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启动服务器