AWS Elastic Beanstalk:访问系统变量

时间:2014-06-19 18:18:38

标签: java amazon-web-services tomcat7 elastic-beanstalk

我是一个传统的Tomcat Web应用程序,它使用JNDI连接到Postgres数据库(读取context.xml)。 在AWS EBS中,可以使用系统属性来读取特定的内容,例如jdbc连接参数,这样可以轻松地将相同的包用于不同的环境(开发,登台,生产),而无需更改context.xml文件。 由于我使用的是JNDI DataSource,因此我访问原始数据源,然后以这种方式更改网址和密码:

org.apache.tomcat.jdbc.pool.DataSource ds = (DataSource) new InitialContext().lookup("java:/comp/env/jdbc/myapp");
    String jdbcURL = System.getProperty("JDBC_CONNECTION_STRING"); 
    String username = System.getProperty("PARAM1"); 
    String password = System.getProperty("PARAM2"); 
    if (!StringUtils.isEmpty(jdbcURL)){
        ds.setUrl(jdbcURL);
        ds.setUsername(username);
        ds.setPassword(password);
    }

使用Tomcat DataSource我可以访问连接参数的setter和getter。 在本地测试它(在Tomcat的VM参数中添加System参数,它完美地工作。 但是当我在AWS EBS中上传到我的测试环境时,这些参数在开始时(加载应用程序时)是空的,但稍后可用:以这种方式在jsp页面中测试它们

The JDBC_CONNECTION_STRING environment property is:
<%= System.getProperty("JDBC_CONNECTION_STRING") %>
</p>

<p>
The PARAM1 environment property is:
<%= System.getProperty("PARAM1") %>
</p>
<p>]
The PARAM2 environment property is:
<%= System.getProperty("PARAM2") %>
</p>

并打印出正确的值。 我唯一猜到的是系统属性稍后加载,而我在应用程序启动时调用的Listener中建立了与数据库的连接(在web.xml中设置)。

知道为什么会失败吗?

谢谢,

Rohi

编辑:我发现了问题,但没有解决方案: 问题是当在lookup()方法中加载DataSource时,它还尝试建立连接!它不会成功,因为在context.xml中url是localhost,我在部署时没有DB。

有人知道如何不立即连接,但等到第一次getConnection()调用? 这是我的context.xml

<Resource auth="Container" 
        driverClassName="org.postgresql.Driver" 
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
        maxActive="1000" maxIdle="1000" maxWait="2000"
        autoReconnect="true" 
        logAbandoned="true" 
        name="jdbc/townflix" 
        type="org.apache.tomcat.jdbc.pool.DataSource"  
        url="jdbc:postgresql://localhost:5432/mydb?prepareThreshold=3" 
        username="user" 
        password="pass"

/&GT;

1 个答案:

答案 0 :(得分:1)

我不知道它失败的原因,但我可以告诉你我在个人项目中的表现方式。

我使用.ebextensions / * .config文件使用我的配置生成并覆盖context.xml,从而在容器启动之前正确设置我的DataSource。

请参阅:https://github.com/Craftware/Kornell/blob/master/kornell-api/src/main/webapp/.ebextensions/tomcat7.config