动态设置Java Web应用程序的资源

时间:2016-12-07 15:14:45

标签: java mysql java-ee web glassfish

具体来说,我说的是GlassFish服务器和MySQL数据库。

我在部署时通过asadmin为我的应用程序创建JDBC数据源。由于我希望能够同时运行我的应用程序的多个实例,我希望数据源(以及身份验证领域)标识符是可变的,并且可以使用Docker环境变量进行配置。

基本上,我希望每个应用程序实例都有自己的数据库,但同时我希望所有实例共享同一个应用程序和MySQL服务器。

所以我需要能够在部署时配置persistence.xmlweb.xml中的条目(特别是我的持久性单元的jta-data-source和我的登录配置的realm-name

这听起来很简单,但结果非常困难。我发现有一些解决方案,但在我看来非常黑客:

  • 使用Maven修改部署描述符,并为每个实例构建不同的.war。显然,如果每个实例都共享相同的代码,我不想为它们构建一个新的应用程序。
  • 在GlassFish域文件系统中部署后修改部署描述符。这将需要重新启动服务器并为每个实例进行两次部署。
  • 使所有实例共享同一个数据库。这是一种常见做法吗?似乎是不必要的开销。
  • 在描述符中使用系统属性和${reference}。我根本找不到使用GlassFish设置应用程序作用域系统属性的正确方法。

那我该怎么做呢?

另外注意:在运行时修改身份验证领域时,我总是需要重启服务器,对吗?它有什么办法吗?有没有更好的方法来处理这个一般用例(答案可能是肯定的)?

2 个答案:

答案 0 :(得分:0)

我设法找到了一种不太难看的方式。它有点类似于@rene-m在他的WildFly Dockerfile中所做的,也类似于我已经对我的SQL数据库设置脚本所做的事情。

  1. 我已使用占位符替换了数据源和身份验证领域的字符串:

    <jta-data-source>_SOURCE_NAME_</jta-data-source>
    <realm-name>_AUTH_REALM_</realm-name>
    
  2. 在部署脚本中,我提取web.xmlpersistence.xml,并使用部署参数替换占位符。在Alpine shell脚本中,它看起来像这样:

    # Update .war deployment descriptors.
    $JAVA_HOME/bin/jar -xfv $WAR_FILE WEB-INF/web.xml
    $JAVA_HOME/bin/jar -xfv $WAR_FILE WEB-INF/classes/META-INF/persistence.xml
    sed -i "s|_AUTH_REALM_|$AUTH_REALM|g" WEB-INF/web.xml
    sed -i "s|_SOURCE_NAME_|$SOURCE_NAME|g" WEB-INF/classes/META-INF/persistence.xml
    $JAVA_HOME/bin/jar -ufv $WAR_FILE WEB-INF/web.xml
    $JAVA_HOME/bin/jar -ufv $WAR_FILE WEB-INF/classes/META-INF/persistence.xml
    rm -rf WEB-INF/
    
  3. 这非常有效,我只修改容器范围的.war文件,无论如何都限制在单个部署实例中。它将OP(Maven)中发布的第一种方法的过程从编译转移到部署时间。

答案 1 :(得分:0)

使用GlassFish,可以在部署时覆盖web.xmlglassfish-web.xml描述符。在asadmin部署命令中,您可以分别使用--altdd--runtimealtdd指定路径。

使用资源引用时,根本不需要修改persistence.xml!您只需将JTA数据源映射到glassfish-web.xml中的另一个JNDI名称:

<resource-ref>
  <res-ref-name>_SOURCE_NAME_</res-ref-name>
  <jndi-name>jdbc/AlternativeJTADataSource</jndi-name>
</resource-ref>

然后在部署时可以执行以下操作:

  • 从WAR解包web.xml(web.xml应该已经定义了resource-ref
  • 用您需要的任何内容替换默认域名
  • 使用JTA资源引用的映射创建glassfish-web.xml
  • 使用以下内容进行部署:asadmin deploy --altdd web.xml --runtimealtdd glassfish-web.xml application.war