【问题标题】:Dynamically setting resources of a Java web app动态设置 Java Web 应用的资源
【发布时间】:2017-04-22 14:37:14
【问题描述】:

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

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

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

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

这听起来很容易,但结果却异常困难。我发现了一些解决方案,但我认为它们非常老套:

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

那我该怎么办呢?

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

【问题讨论】:

  • 不完全是你的场景,但有很多有用的调整。我制作了一个示例 docker 文件,用于使用运行时和构建配置部署 Wildfly 应用程序。看这里:github.com/BITFORCE-IT/WildFlyApp

标签: java mysql jakarta-ee web glassfish


【解决方案1】:

使用 GlassFish,可以在部署时覆盖 web.xmlglassfish-web.xml 描述符。在asadmin deploy 命令中,您可以分别使用--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
  • 将默认域名替换为您需要的任何名称
  • 创建一个 glassfish-web.xml 并为 JTA 资源 ref 映射
  • 部署类似:asadmin deploy --altdd web.xml --runtimealtdd glassfish-web.xml application.war

【讨论】:

    【解决方案2】:

    我设法找到了一种对我来说不太难看的方法。这有点类似于@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/
      

    这很好用,我只修改了容器范围的.war 文件,无论如何它都仅限于单个部署实例。它将 OP (Maven) 中发布的第一种方法的过程从编译时间转移到部署时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      相关资源
      最近更新 更多