管理和配置指南

JBoss 企业级应用程序平台 6.3

适用于红帽 JBoss 企业版应用程序平台 6

Red Hat Customer Content Services

摘要

本书是安装和配置红帽 JBoss 企业版应用程序平台 6 及其补丁的指南。

第 1 章 介绍

1.1. 关于 Red Hat JBoss 企业版应用程序平台 6

Red Hat JBoss 企业版应用程序平台 6(JBoss EAP 6)s是一个构建在开放标准上并和 Java EE 6 规格兼容的中间件平台。它集成了 JBoss Application Server 7 和高可用性的群集、消息系统、分布式缓存以及其他技术。
JBoss EAP 6 使用了新的模块化结构,允许在有需要时才启用服务,从而提高了启动速度。
管理控制台和管理命令行界面使您不需要再编辑 XML 配置文件并增添了使用脚本和自动化任务的能力。
此外,JBoss EAP 6 包含了 API 和开放框架以用于快速开发安全和可扩充的 Java EE 应用程序。

1.2. JBoss EAP 6 的功能

表 1.1. 6.3.0 版本的功能

功能 描述
Java 认证 认证了 Java EE 6 的 Full 和 Web 配置集。
受管域
  • 对多个服务器实例和物理主机的集中管理,但独立服务器也允许单个的服务器实例。
  • 对每个服务器组的配置、部署、套接字绑定、模块、扩展和系统属性的管理。
  • 对应用程序安全性(包括安全域)的集中式和简化管理。
管理控制台和管理 CLI 新的域或独立服务器管理界面。您不再需要编辑 XML 配置文件了。管理 CLI 也包括可以用脚本完成和管理任务自动化的批模式。
简化的目录格式 modules 目录现在包括了所有的应用服务器模块。公用的和服务器专有的 lib 目录已被抛弃。domainstandalone 目录包含了域和独立部署的 artifact 和配置文件。
模块化的类加载机制 模块将根据需要来加载和卸载。这将提高性能和增强安全性、以及更快的启动和重启速度。
流线型的数据源管理 数据库驱动可以像其他服务一样部署。此外,数据源可以在管理控制台和管理 CLI 里直接创建和管理。
资源使用更少的且效率更高。 JBoss EAP 6 使用了更少的系统资源并比以前的版本更高效率地利用资源。JBoss EAP 6 的启动与停止也比 JBoss EAP 5 快。

1.3. 关于 JBoss EAP 6 操作模式

JBoss EAP 6 为 JBoss EAP 6 实例提供两种操作模式:独立服务器(standalone server)和受管域(managed domain)。
这两种模式的区别在于如何管理服务器,而不是它们为满足最终用户请求而提供的功能。请注意,高可用性(HA)群集功能可以通过这两种模式来实现。您可配置一组独立服务器来组成 HA 群集。

1.4. 关于独立服务器

独立服务器以独立的进程运行,它和以前的 JBoss EAP 版本的唯一运行模式类似。
作为独立服务器运行的 JBoss EAP 实例只是一个单一实例,但也可以运行在群集配置里。

1.5. 关于受管域

受管域是通过单个控制点来管理多个 JBoss EAP 6 实例的模式。
集中管理的 JBoss EAP 6 服务器集合被称作域的成员。域里所有的 JBoss EAP 6 实例共享一个公共的管理策略。
域由一个域控制器、一个或多个主机控制器以及对应每台主机的零或多个服务器组组成。
域控制器是控制域的中心点。它确保每个服务器都按照域的管理策略进行配置。域控制器也是主机控制器。
主机控制器是一个运行 domain.shdomain.bat 脚本的物理或虚拟主机。我们配置主机控制器将域管理任务委托给域控制器。
每台主机上的主机控制器和域控制器进行交互以控制运行在主机上的应用服务器实例的生命周期,并协助域控制器管理主机。每台主机都可以包含多个服务器组。
服务器组是一系列安装了 JBoss EAP 6 的服务器实例并作为一个服务器进行管理和配置。域控制器管理部署至服务器组的应用程序的配置。因此,服务器组里的每个服务器都共享相同的配置和部署。
域控制器、单个主机控制器和多个服务器是可以运行在相同物理系统上的相同 JBoss EAP 6 实例里的。
主机控制器捆绑在专门的物理(或虚拟)主机上。如果使用不同的配置,您可以在相同的硬件上运行多个主机控制器,确保端口和其他资源不会冲突。
A managed domain with one domain controller, three host controllers, and three server groups. Servers are members of server groups, and may be located on any of the host controllers in the domain.

图 1.1. 受管域的图形表示形式

1.6. 关于域控制器

域控制器是一个充当域集中管理点的 JBoss EAP 6 服务器实例。您可以配置主机控制器为域控制器。域控制器的主要职责是:
域控制器的主要职责是:
  • 维护域的集中管理策略。
  • 确保所有的主机控制器都意识到其当前的内容。
  • 协助主机控制器以确保所有运行的 JBoss EAP 6 实例都按照这个策略进行配置。
集中管理策略默认保存在 domain/configuration/domain.xml 文件里,它位于域控制器的主机文件系统上解压的 JBoss EAP 6 安装目录里。
domain.xml 必须位于作为域控制器运行的主机控制器的 domain/configuration/ 目录里。这个文件对于不是作为域控制器的主机控制器上的安装来说并不是强制的,虽然 domain.xml 文件的出现也没有害处。
domain.xml 文件包含不同配置集的配置,它们可都用于运行在域里的服务器实例。配置集的配置包含组成配置集的不同子系统的详细配置。域配置也包含对套接字组和服务器组的定义。

1.7. 关于域控制器发现和失效切换

设置受管域时,每个主机控制器都必须用联系域控制器所需的信息进行配置。在 JBoss EAP 6.3 里,每个主机控制器都可以配置多个选项来寻找域控制器。主机控制器轮询选项列表,直至成功找到域控制器。
这个允许主机控制器用联系信息重新配置为备份域控制器。如果主域控制器出现问题,备份主机控制器可以提升为主域控制器,提升后它可以自动失效切换至新的主控制器。
下面是一个如何用多个选项寻找域控制器来配置主机控制器的例子。
<domain-controller>  
    <remote security-realm="ManagementRealm">  
          <discovery-options>  
              <static-discovery name="primary" host="172.16.81.100" port="9999"/>  
              <static-discovery name="backup" host="172.16.81.101" port="9999"/>  
          </discovery-options>  
    </remote>  
</domain-controller>
静态的发现选项包括下列强制的属性:

名称
这个域控制器发现选项的名称
主机
远程域控制器的主机名称。
重点
远程域控制器的端口。
在上面的例子里,第一个发现选项是期望成功的选项。第二个可以用在失效切换的情况下。
如果主域控制器出现问题,用 --backup 选项启动的主机控制器将被提升为域控制器。

注意

--backup 选项启动主机控制器将导致控制器维护域配置的一个本地拷贝。如果主机控制器被重设为域控制器,这个配置将被使用。

过程 1.1. 将主机控制器提升为域控制器

  1. 确保原来的域控制器已停止。
  2. 使用管理 CLI 连接至将成为新域控制器的主机控制器。
  3. 执行下列命令来将主机控制器配置为新的域控制器。
    /host=HOST_NAME:write-local-domain-controller
  4. 执行下列命令来重新加载主机控制器。
    reload --host=HOST_NAME
步骤 2 里选择的主机控制器将充当域控制器。

1.8. 关于主机控制器

domain.shdomain.bat 脚本在主机上运行时启动主机控制器。
主机控制器的主要职责是服务器管理。它委托域管理任务并负责启动和停止运行在主机上的单独应用服务器进程。
它和域控制器进行交互以帮助管理服务器和域控制器间的通讯。域里多个主机服务器可以和单个域控制器进行交互。因此,所有的主机控制器和运行在单一域模式下的服务器实例可以拥有单一的域控制器且必须属于相同的域。
每个主机控制器默认都从主机的文件系统上解压的 JBoss EAP 6 安装的 domain/configuration/host.xml 文件读取配置。host.xml 包含下列特定主机专有的配置信息:
  • 要从这个安装位置运行的 JBoss EAP 6 实例名称
  • 任何下列的配置:
    • 主机控制器如何联系域控制器来注册自身并访问域配置。
    • 如何找到并联系远程的域控制器。
    • 主机控制器将充当域控制器
  • 这些条目是本地物理安装专有的配置。例如,domain.xml 里声明的命名接口定义可以映射到 domain.xml 里实际的主机专有的 IP 地址。domain.xml 里的绝对路径名可以映射到 host.xml 里实际的文件系统路径。

1.9. 关于服务器组

服务器组是一个进行集中管理和配置的服务器实例集合。在受管域里,每个应用服务器实例都属于一个服务器组,即使它只是唯一的成员。组里的服务器实例共享相同的配置集和部署的内容。
域控制器和主机控制器在域里的每个服务器组的所有服务器实例上强制实施标准的配置。
域可由多个服务器组组成。不同的服务器组可以用不同的配置集和部署来配置。域可以用提供不同服务的不同服务器层来配置。
不同的服务器组也可以由相同的配置集和部署。例如,允许应用程序升级的轮换,当应用程序在某个服务器组上升级后再在另外的服务器组里更新,从而避免了整个服务的中断。
下面是一个服务器组定义示例:
<server-group name="main-server-group" profile="default">
 <socket-binding-group ref="standard-sockets"/>
  <deployments>
   <deployment name="foo.war_v1" runtime-name="foo.war"/>
   <deployment name="bar.ear" runtime-name="bar.ear"/>
  </deployments>
</server-group>
服务器组包括下列强制的属性:
  • name:服务器组的名称
  • profile:服务器组的配置集的名称
  • socket-binding-group:用于组里服务器的默认套接字绑定组的名称。在 host.xml 里可以对每个服务器覆盖这个名称。然而,对于每个服务器组这都是一个强制性的元素,如果缺失,域将无法启动。
服务器组包含下列可选属性:
  • deployments:部署在组里服务器上的部署内容
  • system-properties:组里服务器上设置的系统属性
  • jvm:组里所有服务器的默认 JVM。主机控制器将这些设置和 host.xml 里的其他配置进行合并以生成启动服务器的 JVM 的设置。

1.10. 关于 JBoss EAP 6 配置集

以前 JBoss EAP 版本里使用的配置集的概念不再使用了。JBoss EAP 6 现在使用更少的配置文件来保存配置信息。
模块和驱动现在是根据需要加载的,所以以前 JBoss EAP 6 版本里让服务器更高效地启动的 default 配置集的概念不再适用。
在部署期间,模块依赖关系将被确定、排序且由服务器或域控制器进行解析,并按正确的顺序加载。当没有部署需要模块时,它将被卸载。
您可以从配置里删除子系统来禁用模块或手动卸载驱动或其他服务。然而,大多数情况下这是不必要的。如果你的应用程序没有使用模块,它不会被加载。

第 2 章 应用服务器管理

2.1. 启动和停止 JBoss EAP 6

2.1.2. 将 JBoss EAP 6 作为独立服务器启动

介绍

本节涵盖将 JBoss EAP 6 作为独立服务器启动的步骤

过程 2.1. 将平台服务作为独立服务器启动

  1. 对于红帽企业版 Linux。

    运行命令:EAP_HOME/bin/standalone.sh
  2. 对于 Microsoft Windows 服务器。

    运行命令:EAP_HOME\bin\standalone.bat
  3. 可选:指定其他的参数。

    要查看传入启动脚本的其他参数,请使用 -h 参数。
结果

JBoss EAP 6 服务器实例已启动。

2.1.3. 将 JBoss EAP 6 作为受管域启动

操作顺序

域控制器必须在域里任何服务器组里的任何从服务器之前启动。先在域控制器上,然后在每个关联的主机控制器和其他主机上使用这个过程。

过程 2.2. 将平台服务作为受管域启动

  1. 对于红帽企业版 Linux。

    运行命令: EAP_HOME/bin/domain.sh
  2. 对于 Microsoft Windows 服务器。

    运行: EAP_HOME\bin\domain.bat
  3. 可选:传递其他参数到启动脚本里。

    请使用 -h 参数来获取传递到启动脚本里的参数列表。
结果

JBoss EAP 6 受管域实例已启动。

2.1.4. 配置受管域里主机的名字

概述

运行在受管域里的每个主机都必须有一个唯一的名称。为了简化管理并允许在多个主机上使用相同的主机配置文件,服务器将使用下列次序来确定主机名。

  1. host.xml 配置文件里的 host 元素的 name 属性,如果指定了的话。
  2. jboss.host.name 系统属性的值。
  3. jboss.qualified.host.name 系统属性里最后一个句点(".")后的值,如果没有句点则是整个值。
  4. 基于 POSIX 的操作系统的 HOSTNAME 环境变量或 Microsoft Windows 的 COMPUTERNAME 环境变量里的句点(“.”)后的值,如果没有句点则是整个值。

关于设置环境变量的信息,请参考操作系统的相关文档。关于如何设置系统属性的信息,请参考 第 3.6.11 节 “用管理 CLI 配置系统属性”
本节描述了如何通过系统属性或硬编码在配置文件里设置主机名。

过程 2.3. 使用系统属性配置主机名

  1. 打开主机配置文件,如 host.xml
  2. 找到 host 元素,例如:
    <host name="master" xmlns="urn:jboss:domain:1.6">
    
  3. 如果有这些内容,请删除 name="HOST_NAME" 属性声明。host 元素应该类似于下面的例子。
    <host xmlns="urn:jboss:domain:1.6">
    
  4. -Djboss.host.name 参数启动服务器,例如:
    -Djboss.host.name=HOST_NAME

过程 2.4. 使用专有名称配置主机名

  1. 用下列语法启动 JBoss EAP 从主机:
    bin/domain.sh --host-config=HOST_FILE_NAME
    例如:
    bin/domain.sh --host-config=host-slave01.xml
  2. 启动管理 CLI。
  3. 使用下列语法来替代主机名:
    /host=EXISTING_HOST_NAME:write-attribute(name="name",value=UNIQUE_HOST_NAME)
    例如:
    /host=master:write-attribute(name="name",value="host-slave01")
    你应该看到下面的结果。
     "outcome" => "success"
    这修改了 host-slave01.xml 文件里的 host name 属性:
    <host name="host-slave01" xmlns="urn:jboss:domain:1.6">
    
  4. 您必须重新加载使用旧的主机名的服务器配置以完成这个过程。
    reload --host=EXISTING_HOST_NAME
    例如:
    reload --host=master

2.1.5. 在两台主机上创建受管域

注意

您可能需要配置防火墙以运行这个例子。
您可以在两台主机上创建受管域,其中一台主机是域控制器而另外一个是普通主机。详情请参考 第 1.6 节 “关于域控制器”
  • IP1 = IP address of the domain controller (Machine 1)
  • IP2 = IP address of the host (Machine 2)

过程 2.5. 在两台主机上创建受管域

  1. 在 Machine 1 上

    1. 使用 add-user.sh 脚本添加管理用户,例如 slave01,让主机可以通过域控制器进行验证。请注意 add-user 输出里的 SECRET_VALUE
    2. host-master.xml 配置文件启动域,它为指定的域控制器进行了预先配置。
    3. -bmanagement=$IP1 使域控制器对于其他主机可见。
      [$JBOSS_HOME/bin]$ ./domain.sh --host-config=host-master.xml -bmanagement=$IP1
  2. 在 Machine 2 上

    1. 用用户凭证更新 $JBOSS_HOME/domain/configuration/host-slave.xml 文件。
      	<?xml version='1.0' encoding='UTF-8'?>
              <host xmlns="urn:jboss:domain:1.6" name="slave01">   
              <!-- add user name here -->
               <management>
                  <security-realms>
                     <security-realm name="ManagementRealm">
                        <server-identities>
                          <secret value="$SECRET_VALUE" />   
                          <!-- use secret value from add-user.sh output-->
                        </server-identities> 
                        ...
      
    2. 启动主机。
      [$JBOSS_HOME/bin]$ ./domain.sh --host-config=host-slave.xml  -Djboss.domain.master.address=$IP1 -b=$IP2
  3. 现在我们可以管理域了。

    通过 CLI:
    [$JBOSS_HOME/bin]$ ./jboss-cli.sh -c --controller=$IP1
    
    通过 Web 控制台:
    http://$IP1:9990
    
    访问服务器的索引页:
    http://$IP2:8080/
    http://$IP2:8230/
    

2.1.6. 用替代配置启动 JBoss EAP 6

如果您没有指定配置文件,服务器将用默认的文件启动。然而,当您启动服务器时,您可以手动指定一个配置文件。启动过程会稍有不同,这取决于您是使用受管域还是独立服务器、以及您使用的操作系统。

必须具备的条件

  • 在使用替代配置文件之前,请将 default 配置作为模版使用。对于受管域,配置文件必须位于 EAP_HOME/domain/configuration/ 目录。对于独立服务器,配置文件必须位于 EAP_HOME/standalone/configuration/ 目录。

注意

EAP_HOME/docs/examples/configs/ 目录里包含了几个配置示例。请用这些例子来启用额外的功能,如群集或 Transactions XTS API。

过程 2.6. 用其他配置启动实例

  1. 独立服务器

    对于独立服务器,请将配置文件的名称作为 --server-config 参数的选项。配置文件必须位于 EAP_HOME/standalone/configuration/ 目录里,而且您需要指定相对这个目录的路径。

    例 2.1. 在红帽企业版 Linux 里对独立服务器使用其他的配置文件

    [user@host bin]$ ./standalone.sh --server-config=standalone-alternate.xml
    这个例子使用了 EAP_HOME/standalone/configuration/standalone-alternate.xml 配置文件。

    例 2.2. 在 Microsoft Windows 服务器里对独立服务器使用其他的配置文件

    C:\EAP_HOME\bin> standalone.bat --server-config=standalone-alternate.xml
    这个例子使用了 EAP_HOME\standalone\configuration\standalone-alternative.xml 配置文件。
  2. 受管域

    对于受管域,请为 --domain-config 参数提供配置文件的名称。这个文件必须位于 EAP_HOME/domain/configuration/ 目录,且您需要指定相对这个目录的路径。

    例 2.3. 在红帽企业版 Linux 里对受管域使用其他的配置文件

    [user@host bin]$ ./domain.sh --domain-config=domain-alternate.xml
    这个例子使用了 EAP_HOME/domain/configuration/domain-alternate.xml 配置文件。

    例 2.4. 在 Microsoft Windows 服务器里对受管域使用其他的配置文件

    C:\EAP_HOME\bin> domain.bat --domain-config=domain-alternate.xml
    
    
    这个例子使用了 EAP_HOME\domain\configuration\domain-alternate.xml 配置文件。
结果

使用替代配置运行了 JBoss EAP 6。

2.1.7. 停止 JBoss EAP 6

您停止 JBoss EAP 6 的方式取决于它是如何启动的。本节涵盖停止交互式启动的实例、停止作为服务启动的实例以及停止用脚本复制至后台进程的实例。

注意

关于在受管域里停止服务器或服务器组的信息,请参考 第 2.2.3 节 “使用管理控制台停止服务器”。关于使用管理 CLI 停止服务器的信息,请参考 第 2.2.1 节 “用管理 CLI 启动或停止服务器。”
  • 过程 2.7. 停止 JBoss EAP 6 的实例

    • 停止从命令提示交互式启动的实例。

      在 JBoss EAP 6 运行的终端窗口里按 Ctrl-C
  • 过程 2.8. 停止作为操作系统服务启动的实例。

    根据操作系统使用下列步骤。
      • Red Hat Enterprise Linux

        对于红帽企业版 Linux,如果您已经编写了服务脚本,请使用它的 stop 功能。这需要编写到脚本里。然后您可以使用 service scriptname stop,这里的 scriptname 是脚本名称。
      • Microsoft Windows Server

        在 Microsoft Windows 里,使用 net service 命令,或者通过控制面板里的 Services 小程序来停止服务。
  • 过程 2.9. 停止在后台运行的示例(红帽企业版 Linux)

    1. 获取进程的 ID(PID):
      • 如果只有一个实例在运行(独立模式)

        下面的命令都会返回单个 JBoss EAP 6 实例的 PID
        • pidof java
        • jps
          jps 命令将返回两个进程的 ID:jboss-modules.jarjps 自身。请使用 jboss-modules.jar 的 ID 来停止 EAP 实例)
      • 如果有多个 EAP 实例在运行(域模式)

        有多个 EAP 实例运行时要确定正确的进程需要使用更复杂的命令。
        • jps 命令可以使用冗余模式来提供 java 进程的更多信息。
          下面是确定不同 EAP 进程的冗余 jps 命令的摘要,包括 PID 和角色:
          $ jps -v
          12155 jboss-modules.jar -D[Server:server-one] -XX:PermSize=256m -XX:MaxPermSize=256m -Xms1303m 
          ...
          
          12196 jboss-modules.jar -D[Server:server-two] -XX:PermSize=256m -XX:MaxPermSize=256m -Xms1303m 
          ...
          
          12096 jboss-modules.jar -D[Host Controller] -Xms64m -Xmx512m -XX:MaxPermSize=256m 
          ...
          
          11872 Main -Xms128m -Xmx750m -XX:MaxPermSize=350m -XX:ReservedCodeCacheSize=96m -XX:+UseCodeCacheFlushing 
          ...
          
          11248 jboss-modules.jar -D[Standalone] -XX:+UseCompressedOops -verbose:gc 
          ...
          
          12892 Jps 
          ...
          
          12080 jboss-modules.jar -D[Process Controller] -Xms64m -Xmx512m -XX:MaxPermSize=256m 
          ...
          
        • ps aux 命令也可以用来返回多个 EAP 实例的信息。
          下面是确定不同 EAP 进程的冗余 ps aux 命令的摘要,包括 PID 和角色:
          $ ps aux | grep java
          username 12080  0.1  0.9 3606588 36772 pts/0   Sl+  10:09   0:01 /path/to/java -D[Process Controller] -server -Xms128m -Xmx128m -XX:MaxPermSize=256m 
          ...
          
          username 12096  1.0  4.1 3741304 158452 pts/0  Sl+  10:09   0:13 /path/to/java -D[Host Controller] -Xms128m -Xmx128m -XX:MaxPermSize=256m 
          ...
          
          username 12155  1.7  8.9 4741800 344224 pts/0  Sl+  10:09   0:22 /path/to/java -D[Server:server-one] -XX:PermSize=256m -XX:MaxPermSize=256m -Xms1000m -Xmx1000m -server -
          ...
          
          username 12196  1.8  9.4 4739612 364436 pts/0  Sl+  10:09   0:22 /path/to/java -D[Server:server-two] -XX:PermSize=256m -XX:MaxPermSize=256m -Xms1000m -Xmx1000m -server 
          ...
          
        在上面的例子里,Process Controller 进程是停止以停止整个域的进程。
        grep 工具可以和这些命令一起使用来确定 Process Controller
        jps -v | grep "Process Controller"
        ps aux | grep "Process Controller"
    2. 运行 kill PID 给进程发送 TERM 信号,这里的 PID 是上面的命令确定的进程号。
结果

每个方法都可以干净地关闭 JBoss EAP 6,所以不会丢失数据。

2.1.8. 服务器启动参数和开关参考

应用服务器启动脚本在运行时接受其他参数和开关。这些参数允许服务器根据 standalone.xmldomain.xmlhost.xml 配置文件里定义的其他配置启动。这可能包括用其他套接字绑定集或次级配置启动服务器。在启动时使用 help 开关可以参考这些可用的参数列表。

例 2.5. 

下面的例子和 第 2.1.2 节 “将 JBoss EAP 6 作为独立服务器启动”第 2.1.3 节 “将 JBoss EAP 6 作为受管域启动” 里解释的服务器启动类似,但添加了 -h--help 开关。下表解释了 help 开关的结果。
独立模式:
[localhost bin]$ standalone.sh -h
域模式:
[localhost bin]$ domain.sh -h

表 2.1. 运行时开关和参数表

参数或开关 模式 描述
--admin-only 独立服务器模式 设置服务器的运行类型为 ADMIN_ONLY。这将导致它打开管理接口并接受管理请求,但不会启动其他运行时服务或接受最终用户请求。
--admin-only 域模式 设置主机控制器的运行类型为 ADMIN_ONLY。这将导致它打开管理接口并接受管理请求,但不会启动其他运行时服务;如果这个主机控制器不是域的主控制器,将接受来自从主机控制器的转入连接。
-b <value> , -b=<value> 独立服务器模式,域模式 设置系统属性 jboss.bind.address 为给定的值。
-b<interface>=<value> 独立服务器模式,域模式 设置系统属性 jboss.bind.address.<interface> 为给定的值。
--backup 域模式 保持持久性域配置的备份,即使这个主机不是域控制器。
-c <config> , -c=<config> 独立服务器模式 要使用的服务器配置文件的名称。默认是 standalone.xml
-c <config> , -c=<config> 域模式 要使用的服务器配置文件的名称。默认是 domain.xml
--cached-dc 域模式 如果主机不是域控制器且在引导时无法联系域控制器,它将使用域配置的本地缓存备份。
--debug [<port>] 独立服务器模式 激活调试模式并用可选参数来指定端口。只有启动脚本支持才可以使用。
-D<name>[=<value>] 独立服务器模式,域模式 设置系统属性。
--domain-config=<config> 域模式 要使用的服务器配置文件的名称。默认是 domain.xml
-h , --help 独立服务器模式,域模式 显示帮助信息并退出。
--host-config=<config> 域模式 要使用的主机配置文件的名称。默认是 host.xml
--interprocess-hc-address=<address> 域模式 主机控制器侦听的与进程控制器通讯的地址。
--interprocess-hc-port=<port> 域模式 主机控制器侦听的与进程控制器通讯的端口。
--master-address=<address> 域模式 设置系统属性 jboss.domain.master.address 为给定的值。在默认的从主机控制器配置里,它被用来配置和主主机控制器进行原生通讯的地址。
--master-port=<port> 域模式 设置系统属性 jboss.domain.master.port 为给定的值。在默认的从主机控制器配置里,它被用来配置和主主机控制器进行原生通讯的端口。
--read-only-server-config=<config> 独立服务器模式 要使用的服务器配置文件的名称。它和 --server-config-c 不同,因为原始文件不会被覆盖。
--read-only-domain-config=<config> 域模式 要使用的域配置文件的名称。这和 --domain-config-c 参数不同,因为初始文件不会被覆盖。
--read-only-host-config=<config> 域模式 要使用的主机配置文件的名称。这和 --host-config 参数不同,因为初始文件不会被覆盖。
-P <url> , -P=<url> , --properties=<url> 独立服务器模式,域模式 从给定的 URL 加载系统属性。
--pc-address=<address> 域模式 进程控制器与其控制的进程通讯时侦听的地址。
--pc-port=<port> 域模式 进程控制器与其控制的进程通讯时侦听的端口。
-S<name>[=<value>] 独立服务器模式 设置安全属性。
--server-config=<config> 独立服务器模式 要使用的服务器配置文件的名称。默认是 standalone.xml
-u <value> , -u=<value> 独立服务器模式,域模式 设置系统属性 jboss.default.multicast.address 为给定的值。
-v , -V , --version 独立服务器模式,域模式 显示应用服务器的版本并退出。

2.2. 启动和停止服务器

2.2.1. 用管理 CLI 启动或停止服务器。

您可以用管理 CLI 或管理控制台来启动和停止服务器(独立服务器模式)。在域模式里,您可以只启动服务器实例。这两个管理工具都允许您控制单个独立服务器实例,或者选择性地管理受管域部署里的多个服务器。如果您在域模式里使用管理控制台,请参考 第 2.2.2 节 “使用管理控制台启动服务器” 里的说明。如果您在使用管理 CLI,针对独立服务器和受管域实例的过程是不一样。
用管理 CLI 启动或停止独立服务器。

独立服务器实例可以用命令行脚本启动,并用 shutdown 命令在管理 CLI 里关闭。如果你再次需要这个实例,请按照 第 2.1.2 节 “将 JBoss EAP 6 作为独立服务器启动” 里描述的过程再次启动。

例 2.6. 通过管理 CLI 停止独立服务器实例

[standalone@localhost:9999 /] shutdown
用管理 CLI 启动或停止受管域

如果你在运行受管域,管理控制台会允许你选择启动或关闭域里的特定服务器。这包括整个域里的服务器组,以及主机上的特定服务器实例。

例 2.7. 通过管理 CLI 停止受管域里的服务器主机

和独立服务器实例类似, shutdown 命令用于关闭声明的受管域主机。这个例子通过在调用关闭操作前声明实例名来关闭名为 master 的服务器主机。请用 tab 健来协助完成字符串并开放可见变量如可用的主机值。
[domain@localhost:9999 /] /host=master:shutdown

例 2.8. 通过管理 CLI 停止受管域里的服务器组

这个例子通过在调用 startstop 操作前声明组启动了一个名为 main-server-group 的默认服务器组。请用 tab 健来协助完成字符串并开放可见变量如可用的主机组名的值。
[domain@localhost:9999 /] /server-group=main-server-group:start-servers
[domain@localhost:9999 /] /server-group=main-server-group:stop-servers

例 2.9. 通过管理 CLI 停止受管域里的服务器实例

这个例子通过在调用 startstop 操作前声明主机启动和停止了 master 主机上的一个名为 server-one 的服务器实例。请用 tab 健来协助完成字符串并开放可见变量如可用的主机和服务器配置的值。
[domain@localhost:9999 /] /host=master/server-config=server-one:start
[domain@localhost:9999 /] /host=master/server-config=server-one:stop

2.2.2. 使用管理控制台启动服务器

过程 2.10. 启动受管域里的服务器

  1. 在控制器的顶部选择 Runtime 标签页。展开 Server 菜单并选择 Overview
  2. Server Instances 列表里,选择要启动的服务器。正在运行的服务器会用一个复选框标记表示。
    在这个列表的实例上悬停会在服务器细节下面以蓝色字体显示选项。
  3. 要启动这个实例,请在 Start Server 文本出现时点击它。然后会出现一个确认对话框,点击 Confirm 按钮启动服务器。
结果

所选的服务器已启动并在运行中。

2.2.3. 使用管理控制台停止服务器

过程 2.11. 使用管理控制台停止受管域里的服务器

  1. 在控制器的顶部选择 Runtime 标签页。展开 Domain 菜单并选择 Overview
  2. 可用的 Server Instances 列表将显示在 Hosts, groups and server instances 表里。正在运行的服务器用一个复选框标记表示。
  3. 将鼠标在所选的服务器上悬停。点击出现的 Stop Server 文本。然后将出现一个确认对话框。
  4. 点击 Confirm 按钮来停止服务器。
结果

所选的服务器已停止。

2.3. 文件系统路径

2.3.1. 文件系统路径

JBoss EAP 6 使用了文件系统路径的逻辑名称。domain.xmlhost.xmlstandalone.xml 配置都包含一个可以声明路径的部分。然后配置的其他部分可以通过逻辑名称引用这些路径,避免了为每个实例声明绝对路径。这有利于配置和管理,因为它允许将专有的主机配置解析为同一的逻辑名称。
例如,日志子系统配置包括对 jboss.server.log.dir 路径的引用,它指向服务器的 log 目录。

例 2.10. 日志目录的相对路路径示例

<file relative-to="jboss.server.log.dir" path="server.log"/>
JBoss EAP 6 自动提供大量的标准路径而无需用户在配置文件进行配置。

表 2.2. 标准路径

描述
jboss.home.dir JBoss EAP 6 的根目录。
user.home 用户的主目录。
user.dir 用户的当前工作目录。
java.home Java 的安装路径
jboss.server.base.dir 单独服务器实例的根目录。
jboss.server.data.dir 服务器用于持久性数据文件存储的目录。
jboss.server.config.dir 包含服务器配置的目录。
jboss.server.log.dir 服务器用于日志文件存储的目录。
jboss.server.temp.dir 服务器用于临时文件存储的目录。
jboss.controller.temp.dir 主机控制器用于临时文件存储的目录。
覆盖路径

如果您运行的是独立服务器,您可以以下面两种方式覆盖 jboss.server.base.dirjboss.server.log.dirjboss.server.config.dir 路径。

  1. 您可以在启动服务器时传入命令行参数。例如:
    bin/standalone.sh -Djboss.server.log.dir=/var/log
  2. 您可以修改服务器配置文件里的 JAVA_OPTS 变量。请打开 EAP_HOME/bin/standalone.conf 文件并在结尾添加下列内容:
    JAVA_OPTS="$JAVA_OPTS Djboss.server.log.dir=/var/log"
运行在受管域里的服务器不支持路径覆盖。

添加自定义路径

您也可以创建自定义的路径。例如,您可以定义用于日志的相对路径:

my.relative.path=/var/log
然后您可以让日志处理程序使用 my.relative.path

2.4. 配置文件

2.4.1. 关于 JBoss EAP 6 配置文件

JBoss EAP 6 的配置和以前版本已经有了很大的修改。最显著的不同是使用了简化的配置文件结构,它包含下面列出的一个或多个文件。

表 2.3. 配置文件的位置

服务器模式 位置 目的
domain.xml EAP_HOME/domain/configuration/domain.xml 这是受管域的主配置文件。只有域主控制器可以读取这个文件。对于其他成员,它可以被删除。
host.xml EAP_HOME/domain/configuration/host.xml 这个文件包含了受管域里的物理主机专有的配置细节,如网络接口、套接字绑定、主机名称和其他主机专有的细节。host.xml 文件包含了 host-master.xmlhost-slave.xml 的全部功能,正如下面所描述的。这个文件没有出现在独立服务器里。
host-master.xml EAP_HOME/domain/configuration/host-master.xml 这个文件包含了作为受管域里主服务器运行所需的配置细节。这个文件不会出现在独立服务器里。
host-slave.xml EAP_HOME/domain/configuration/host-slave.xml 这个文件包含了作为受管域里从服务器运行所需的配置细节。这个文件不会出现在独立服务器里。
standalone.xml EAP_HOME/standalone/configuration/standalone.xml 这是用于独立服务器的默认配置文件。它包含了独立服务器的所有信息,如子系统、网络、部署、套接字绑定和其他配置细节。当您启动独立服务器时会自动使用这个配置。
standalone-full.xml EAP_HOME/standalone/configuration/standalone-full.xml 这是用于独立服务器的配置示例。它包含对每种可能的子系统的支持,除了那些要求高可用性的子系统。要使用它,请停止您的服务器并用下列命令重启:EAP_HOME/bin/standalone.sh -c standalone-full.xml
standalone-ha.xml EAP_HOME/standalone/configuration/standalone-ha.xml 这个配置文件示例启用所有的默认子系统并为独立服务器添加了 mod_cluster 和 JGroups 子系统,所以它可以参与高可用性或负载平衡群集。这个文件不适用于受管域。要使用这个配置,请停止您的服务器并用下列命令重启:EAP_HOME/bin/standalone.sh -c standalone-ha.xml
standalone-full-ha.xml EAP_HOME/standalone/configuration/standalone-full-ha.xml 这是用于独立服务器的配置示例。它包含对每种可能的子系统的支持,包含那些要求高可用性的子系统。要使用它,请停止您的服务器并用下列命令重启:EAP_HOME/bin/standalone.sh -c standalone-full-ha.xml
这些只是默认的位置。您可以在运行时指定不同的配置文件。

2.4.2. 基于描述符的属性替换

应用程序配置 - 例如,数据源连接参数 - 通常在开发、测试和产品部署时都会不同。这有时是通过构建系统脚本实现的,因为 Java EE 规格没有包含表达这些配置的方法。
对于 JBoss EAP 6,您可以使用 Descriptor-based property replacement 在外部管理配置。
基于描述符的属性替换(Descriptor-based property replacement)基于描述符替换属性,允许您从应用程序和构建链里删除关于环境的假设。您可以在部署描述符而不是应用程序或构建系统脚本里指定环境专有的配置。您可以在文件里或作为命令行参数提供配置。
基于描述符的属性替换可以通过 standalone.xmldomain.xml 全局性地启用:
<subsystem xmlns="urn:jboss:domain:ee:1.1">
  <spec-descriptor-property-replacement>
    true
  </spec-descriptor-property-replacement>
  <jboss-descriptor-property-replacement>
    true
  </jboss-descriptor-property-replacement>
</subsystem>
ejb-jar.xmlpersistence.xml 里的 Java EE 描述符可以被替换。这默认是禁用的。
JBoss 专有的描述符替换默认是启用的。描述符可以在以下文件里替换:
  • jboss-ejb3.xml
  • jboss-app.xml
  • jboss-web.xml
  • *-jms.xml
  • *-ds.xml
例如,具有下列注解的 Bean:
 @ActivationConfigProperty(propertyName = "connectionParameters", propertyValue = "host=192.168.1.1;port=5445")
启用了基于描述符的属性替换后,connectionParameters 可以通过命令行来指定:
./standalone.sh -DconnectionParameters='host=10.10.64.1;port=5445'
通过系统属性实现相同功能:
<activation-config>
  <activation-config-property>
    <activation-config-property-name>
      connectionParameters
      </activation-config-property-name>
    <activation-config-property-value>
      ${jms.connection.parameters:'host=10.10.64.1;port=5445'}
    </activation-config-property-value>
  </activation-config-property>
</activation-config>
${jms.connection.parameters:'host=10.10.64.1;port=5445'} 允许命令行提供的参数来覆盖连接参数,而且提供了默认值。

2.4.3. 启用/禁用基于描述符的属性替换

介绍

jboss-as-ee_1_1.xsd 引入了对描述符属性替换的有限控制。本节内容涵盖了配置基于描述符的属性替换所需的步骤。

基于描述符的属性替换标记具有的布尔值:
  • 如果设置为 true,属性替换将被启用。
  • 如果设置为 false,属性替换将被禁用。

过程 2.12. jboss-descriptor-property-replacement

jboss-descriptor-property-replacement 用于在下列描述符里启用或禁用属性替换:
  • jboss-ejb3.xml
  • jboss-app.xml
  • jboss-web.xml
  • *-jms.xml
  • *-ds.xml
jboss-descriptor-property-replacement 的默认值是 true
  1. 在管理 CLI 里,运行下列命令来确定 jboss-descriptor-property-replacement 的值:
    /subsystem=ee:read-attribute(name="jboss-descriptor-property-replacement")
  2. 运行下列命令来配置其行为:
    /subsystem=ee:write-attribute(name="jboss-descriptor-property-replacement",value=VALUE)

过程 2.13. spec-descriptor-property-replacement

spec-descriptor-property-replacement 用于在下列描述符里启用或禁用属性替换:
  • ejb-jar.xml
  • persistence.xml
spec-descriptor-property-replacement 的默认值是 false
  1. 在管理 CLI 里,运行下列命令来确认 spec-descriptor-property-replacement 的值:
    /subsystem=ee:read-attribute(name="spec-descriptor-property-replacement")
  2. 运行下列命令来配置其行为:
    /subsystem=ee:write-attribute(name="spec-descriptor-property-replacement",value=VALUE)
结果

成功地配置了基于描述符的属性替换标记。

2.4.4. 配置文件历史

应用服务器的配置文件包括 standalone.xmldomain.xmlhost.xml。虽然您可以直接编辑这些文件,我们推荐用可用的管理操作(如管理 CLI 或管理控制台)来配置应用服务器模型。
为了协助维护和管理服务器实例,应用服务器在启动时创建了原始配置文件的带时间戳的版本。管理操作导致的任何其他的配置修改都会让原始文件自动备份,而实例的一个工作备份会保留以供引用或回滚。这个归档功能可以扩展为保存、加载和删除服务器配置的快照,从而允许回调和回滚场景。

2.4.5. 用以前的配置启动服务器

下面的例子展示了如何用独立服务器的 standalone.xml 里的以前的配置启动应用服务器。相同的概念也适用于受管域的 domain.xmlhost.xml
这个例子回调了管理操作修改服务器模型时应用服务器自动保存的配置。
  1. 确定您要启动的备份版本。这个例子将回调成功引导后第一次修改前的服务器模型的实例。
    EAP_HOME/standalone/configuration/standalone_xml_history/current/standalone.v1.xml
  2. 传入 jboss.server.config.dir 下的相对文件名,用备份模型的配置启动服务器。
    EAP_HOME/bin/standalone.sh --server-config=standalone_xml_history/current/standalone.v1.xml
结果

应用服务器用所选的配置启动了。

注意

域配置历史位于 EAP_HOME/domain/configuration/domain_xml_history/current/domain.v1.xml
传入 jboss.domain.config.dir 下的相对文件名,用备份模型的配置启动服务器。
用下面的配置启动域:
EAP_HOME/bin/domain.sh --domain-config=domain_xml_history/current/domain.v1.xml

2.4.6. 使用管理 CLI 保存配置快照

概述

配置快照是当前服务器配置的时间点拷贝。管理员可以保存和加载这些拷贝。

下面的例子使用了 standalone.xml 配置文件,但相同的过程适用于 domain.xmlhost.xml 配置文件。

过程 2.14. 创建配置快照并保存

  • 保存快照

    运行 take-snapshot 操作来创建当前服务器配置的快照。
    [standalone@localhost:9999 /] :take-snapshot
    {
        "outcome" => "success",
        "result" => "/home/User/EAP_HOME/standalone/configuration/standalone_xml_history/snapshot/20110630-172258657standalone.xml"
    
结果

保存了当前服务器配置的快照。

2.4.7. 使用管理 CLI 加载配置快照

配置快照是当前服务器配置的时间点拷贝。管理员可以保存和加载这些拷贝。加载快照的过程和用于 第 2.4.5 节 “用以前的配置启动服务器” 的方法类似,都是从命令行而不是管理 CLI 界面运行来创建、列出和删除快照。
下面的例子使用了 standalone.xml 配置文件,但相同的过程适用于 domain.xmlhost.xml 配置文件。

过程 2.15. 加载配置快照

  1. 确定要加载的快照。这个例子将从 snapshot 目录回调下列文件。下面是快照文件的默认路径。
    EAP_HOME/standalone/configuration/standalone_xml_history/snapshot/20110812-191301472standalone.xml
    快照是用相对路径表达的,上面的例子可以像下面这样编写。
    jboss.server.config.dir/standalone_xml_history/snapshot/20110812-191301472standalone.xml
  2. 通过传入文件名用所选的配置快照启动服务器。
    EAP_HOME/bin/standalone.sh --server-config=standalone_xml_history/snapshot/20110913-164449522standalone.xml
结果

服务器用加载快照里选择的配置进行了重启。

2.4.8. 使用管理 CLI 删除配置快照

配置快照是当前服务器配置的时间点拷贝。管理员可以保存和加载这些拷贝。
下面的例子使用了 standalone.xml 配置文件,但相同的过程适用于 domain.xmlhost.xml 配置文件。

过程 2.16. 删除专有的快照

  1. 确定要删除的快照。这个例子将从 snapshot 目录删除下列文件。
    EAP_HOME/standalone/configuration/standalone_xml_history/snapshot/20110630-165714239standalone.xml
  2. 如下例所示,指定快照的名称,运行 :delete-snapshot 命令来删除专有的快照。
    [standalone@localhost:9999 /] :delete-snapshot(name="20110630-165714239standalone.xml")
    {"outcome" => "success"}
    
结果

快照已被删除。

过程 2.17. 删除所有快照

  • 如下例所示,运行 :delete-snapshot(name="all") 命令删除所有的快照。
    [standalone@localhost:9999 /] :delete-snapshot(name="all")
    {"outcome" => "success"}
    
结果

所有快照都已被删除。

2.4.9. 使用管理 CLI 列出所有的配置快照

配置快照是当前服务器配置的时间点拷贝。管理员可以保存和加载这些拷贝。
下面的例子使用了 standalone.xml 配置文件,但相同的过程适用于 domain.xmlhost.xml 配置文件。

过程 2.18. 列出所有的配置快照

  • 列出所有快照

    :list-snapshots 命令列出所有保存的快照。
    [standalone@localhost:9999 /] :list-snapshots
    {
        "outcome" => "success",
        "result" => {
            "directory" => "/home/hostname/EAP_HOME/standalone/configuration/standalone_xml_history/snapshot",
            "names" => [
                "20110818-133719699standalone.xml",
                "20110809-141225039standalone.xml",
                "20110802-152010683standalone.xml",
                "20110808-161118457standalone.xml",
                "20110912-151949212standalone.xml",
                "20110804-162951670standalone.xml"
            ]
        }
    }
    
结果

快照被列出。

第 3 章 管理接口

3.1. 管理应用服务器

JBoss EAP 6 提供了多个管理工具来配置和管理你的实现。其中包括新的管理控制台和管理命令行界面(CLI),以及让专家用户可以开发自己的工具的底层管理 API。

3.2. 管理应用程序编程接口(API)

管理客户

JBoss EAP 6 提供了不同的方法来配置和管理服务器,您可以使用 web 界面、命令行客户或一系列的 XML 配置文件。我们推荐的方法是编辑配置文件,包括管理控制台和管理 CLI。对配置文件的编辑总会在不同视图里同步并最终持久化到 XML 文件里。请注意,在服务器实例运行时对 XML 配置文件的修改将被服务器模型所覆盖。

HTTP API

管理控制台是用 Google Web Toolkit (GWT) 构建的 Web 界面的例子。管理控制台和服务器通过 HTTP 管理接口进行通讯。HTTP API 端点是依赖于 HTTP 协议来集成管理层的管理客户的入口点。它使用 JSON 编码协议和 de-typed RPC 风格的 API 来描述和执行管理操作。 HTTP API 用于 Web 控制台,它也为许多其他客户提供了集成能力。

HTTP API 端点和主机控制器或独立服务器是共存的。HTTP API 端点服务两种不同的上下文,一个用于执行管理操作,令为一个用于访问 Web 界面。在默认情况下,它运行在端口 9990 上。

例 3.1. HTTP API 配置文件示例

<management-interfaces>
  [...]
  <http-interface security-realm="ManagementRealm">
     <socket-binding http="management-http"/>
  </http-interface>
</management-interfaces>
Web 控制台是通过和 HTTP 管理 API 相同的端口来访问的。区别作为默认的本地主机访问的管理控制台、通过专门主机和端口远程访问的管理控制台和开放的域 API 是很重要的。

表 3.1. 访问管理控制台的 URL

URL 描述
http://localhost:9990/console 访问本地主机的管理控制台,它控制受管域的配置。
http://hostname:9990/console 远程访问管理控制台的主机命名和受管域配置。
http://hostname:9990/management 和管理控制台运行在相同端口上的 HTTP 管理 API,它显示原始属性和开放给 API 的值。
Native API

管理 CLI 就是 Native API 工具的一个例子。这个管理工具可用于受管域及独立服务器,它允许用户连接到域控制器或独立服务器实例并执行 de-typed 管理模型里可用的管理操作。

Native API 端点是依赖于原生协议来集成管理层的管理客户的入口点。它使用开放的二进制协议和基于非常少量的 Java 类型的 RPC 风格的 API 来描述和执行管理操作。它被管理 CLI 工具所使用,但也为很多其他客户提供了集成能力。
Native API 端点和主机控制器或独立服务器是共存的。使用管理 CLI 必须启用它。在默认情况下,它运行在端口 9999 上。

例 3.2. Native API 配置文件示例

<management-interfaces>
  <native-interface security-realm="ManagementRealm">
    <socket-binding native="management-native"/>
  </native-interface>
  [...]
</management-interfaces>

3.3. 关于管理控制台和管理 CLI

在 JBoss EAP 6 里,所有的服务器实例和配置都通过管理界面而不是编辑 XML 文件来进行配置。虽然 XML 配置文件仍可进行编辑,通过管理界面的管理提供了额外校验和服务器实例持久性管理的高级功能。服务器运行时对 XML 配置文件的修改仍会被服务器模型覆盖,任何添加的 XML 注释都会被删除。当服务器实例在运行时,我们应该只使用管理界面来修改配置文件。
要通过 Web 浏览器里的图形化用户界面来管理服务器,请使用管理控制台。
要通过命令行界面来管理服务器,则请使用管理 CLI。

3.4. 管理控制台

3.4.1. 管理控制台

管理控制台是用于 JBoss EAP 6 的基于 Web 的管理工具。
您可以使用管理控制台来启动和停止服务器、部署和卸载应用程序、调整系统设置并对服务器配置进行持久性修改。管理控制台也可以执行管理任务,并在修改需要服务器实例重启或重载时进行实时通知。
在受管域里,相同域里的服务器实例和服务器组可以通过域控制器的管理控制台进行集中管理。

3.4.2. 登录到管理控制台

Red Hat JBoss EAP 管理控制台的主页为独立服务器和运行在受管域里的服务器提供了一个统一的入口点。这个页面也提供到重要的开发人员、操作性资源和普通资源的链接。

预备条件

过程 3.1. 登录到管理控制台

  1. 进入管理控制台开始页面

    通过 Web 浏览器进入管理控制台。默认的位置是 http://localhost:9990/console/App.html,其中的 9990 是预定义为管理控制台的套接绑定的。
  2. 登录到管理控制台

    输入您之前创建的帐号的用户名和密码来登录到管理控制台屏幕。
    The login screen for the Management console.

    图 3.1. 管理控制台的登录屏幕

结果

登录后,下面的管理控制台登录页面将出现:http://localhost:9990/console/App.html#home

3.4.3. 修改管理控制台的语言

基于 Web 的管理控制台默认使用英语,但您可以选择下列语言。

所支持的语言

  • 德语 (de)
  • 简体中文 (zh-Hans)
  • 巴西葡萄牙语 (pt-BR)
  • 法语 (fr)
  • 西班牙语 (es)
  • 日语 (ja)

过程 3.2. 修改基于 Web 的管理控制台的语言

  1. 登录到管理控制台。

    登录到基于 Web 的管理控制台。
  2. 打开 Setting 对话框。

    屏幕的右下角是 Settings 标签。点击它打开管理控制台的设置对话框。
  3. 选择语言。

    Locale 选择框里选择语言。然点选择 Save。确认框通知您需要重载应用程序。点击 Confirm。刷新 Web 浏览器以使用新的区域设置。

3.4.4. EAP 控制台里的数据分析

关于 Google Analytics

Google Analytics 是一个提供网站的完整使用统计的免费 Web 分析服务。它提供网站的访问者的关键数据,如访问次数、页面查看、每次访问的页面数及平均逗留时间等。Google Analytics 也提供网站的知名度和使用情况。

关于 EAP 管理控制台里的 Google Analytics

JBoss EAP 6.3 为用户提供启用/禁用管理控制台里 Google Analytics 的选项。Google Analytics 可帮助 Red Hat EAP 团队理解用户如何使用控制台以及哪些部分是用户最在意的。这些信息反过来可帮助 EAP 团队调整控制台的设计、功能、内容以适应用户的需求。

3.4.5. 启用/禁用 EAP 控制台里的 Google Analytics

要启用 EAP 管理控制台里的 Google Analytics:
  • 登录到管理控制台
  • 点击控制台右下角的 Settings 按钮。
    Description

    图 3.2. 管理控制台的登录屏幕

  • 选择 Settings 窗口上的 Enable Usage Data Collection 复选框并点击 Save 按钮。重载应用程序以激活新的设置。
    Description

    图 3.3. 设置窗口(启用使用数据收集)

要在启用后再禁用管理控制台的 Google Analytics,请点击 Settings 窗口上的 Disable Usage Data Collection 选项,然后点击 Save
Description

图 3.4. 设置窗口(禁用使用数据收集)

注意

EAP 6.3 默认是禁用 Google Analytics 的,使用它是可选的。

3.4.6. 使用管理控制台配置服务器

过程 3.3. 配置服务器

  1. 从控制台的顶部选择 Domain 标签页。可用的服务器将显示在表格里。
  2. Available Server Configurations 表格里选择服务器实例。
  3. 在所选的服务器细节上方点击 Edit 按钮。
  4. 修改配置属性。
  5. 点击Save完成。
结果

服务器配置被修改,且会在服务器重启时生效。

3.4.7. 在管理控制台里添加部署

  1. 从控制台的顶部选择 Runtime 标签页。
  2. 对于独立服务器,展开 Server 菜单项并选择 Manage Deployments。对于受管域,展开 Domain 菜单项并选择 Manage DeploymentsManage Deployments 面板将显示。
  3. 点击 Content Repository 标签页上的 Add 按钮。Create Deployment 对话框将会出现。
  4. 在这个对话框里,点击 Browse 按钮。选择您要部署和上传的文件。然后点击 Next 按钮进行。
  5. 验证出现在 Create Deployments 对话框里的部署名和 runtime 名称。验证名称后请点击 Save 按钮上传文件。
结果

所选的内容被上传至服务器且可以进行部署了。

3.4.8. 在管理控制台里创建新的服务器

过程 3.4. 创建新的服务器配置

  1. 进入管理控制台里的 Server Configurations 页面

    从控制台的顶部选择 Domain 标签页。
  2. 创建新的配置

    1. 点击 Available Server Configuration 表上方的 Add 按钮。
    2. Create Server Configuration 对话框里输入基本服务器设置。
    3. 点击 保存 按钮保存新的服务器配置。
结果

新服务器被创建且出现在 Server Configurations 列表里。

3.4.9. 用管理控制台修改默认的日志级别

过程 3.5. 编辑日志级别

  1. 进入管理控制台的 Logging 面板

    1. 对于受管域,选择控制台顶部的 Configuration 标签页,然后从控制台左侧的下拉菜单里选择相关的配置集。
    2. 对于受管域或独立服务器,展开控制台左侧菜单的 Core 菜单并点击 Logging 条目。
    3. 点击控制台顶部的 Log Categories 标签页。
  2. 编辑 logger 细节

    编辑 Log Categories 表格里条目的细节。
    1. Log Categories 表格里选择条目,然后点击下面的 Details 部分里的 Edit 按钮。
    2. 通过 Log Level 下拉框选择类别的日志级别。完成后点击 Save 按钮。
结果

相关类别的日志级别已被更新。

3.4.10. 在管理控制台里创建新的服务器组

过程 3.6. 配置和添加新的服务器组

  1. 进入 Server Groups 视图

    从控制台的顶部选择 Domain 标签页。
  2. 展开左侧菜单里的 Server 标签。选择 Server Groups
  3. 添加服务器组

    点击 Add 按钮来添加新的服务器组。
  4. 配置服务器组

    1. 输入服务器组的名称。
    2. 选择服务器组的配置集。
    3. 选择服务器组的套接字绑定。
    4. 点击 Save 按钮来保存新的组。
结果

新创建的服务器组出现在管理控制台里了。

3.5. 管理 CLI

3.5.1. 关于管理命令行接口(Command Line Interface,CLI)

管理 CLI 是 JBoss EAP 6 的一个命令行管理工具。
使用管理 CLI 启动和停止服务器、部署和卸载应用程序、配置系统设置并执行其他管理任务。操作可以批量模式进行,将多个任务作为一个组来运行。

3.5.2. 启动管理 CLI

过程 3.7. 在 Linux 或 Windows 里启动 CLI

    • 在 Linux 里启动 CLI

      运行 EAP_HOME/bin/jboss-cli.sh 命令:
      $ EAP_HOME/bin/jboss-cli.sh
    • 在 Windows 里启动 CLI

      运行 EAP_HOME\bin\jboss-cli.bat 命令:
      C:\>EAP_HOME\bin\jboss-cli.bat

3.5.3. 退出管理 CLI

过程 3.8. 退出管理 CLI

  • 运行 quit 命令

    在管理 CLI 里,输入 quit 命令:
    [domain@localhost:9999 /] quit

3.5.4. 用管理 CLI 连接受管服务器实例

过程 3.9. 连接至受管服务器实例

  • 运行 connect 命令

    在管理 CLI 里,输入 connect 命令:
    [disconnected /] connect
    Connected to domain controller at localhost:9999
    • 或者,在 Linux 系统里启动管理 CLI 时使用 --connect 参数来连接至受管服务器:
      $ EAP_HOME/bin/jboss-cli.sh --connect
    • --connect 参数可以用来指定服务器的主机和端口。要连接至地址 192.168.0.1 和端口 9999,请使用下列命令:
      $ EAP_HOME/bin/jboss-cli.sh --connect --controller=192.168.0.1:9999

3.5.5. 用管理 CLI 获取帮助

概述

管理 CLI 有带有普通和上下文敏感选项的帮助对话框。对于独立服务器和域控制器,依赖于操作上下文的 help 命令都要求已建立的连接。除非连接已建立,否则这些命令不会出现在列表里。

过程 3.10. 普通和上下文敏感帮助

  1. 运行 help 命令

    在管理 CLI 里,输入 help 命令:
    [standalone@localhost:9999 /] help
  2. 获取上下文敏感帮助

    在管理 CLI 里,输入 help -commands 扩展命令:
    [standalone@localhost:9999 /] help --commands
  3. 关于特定命令的更多详情,请运行 help 并以 '--help' 为参数。
    [standalone@localhost:9999 /]  deploy --help
结果

CLI 帮助信息被显示。

3.5.6. 以批模式使用管理 CLI

介绍

批处理允许大量的操作请求按序列进行分组,然后作为一个单元来执行。如果序列里的任何以一个操作请求执行失败,整个操作组都将回滚。

过程 3.11. 批处理模式命令和操作

  1. 启用批处理模式

    batch 命令启用批处理模式。
    [standalone@localhost:9999 /] batch
    [standalone@localhost:9999 / #]
    提示里的井号(#)指明了批处理模式
  2. 添加操作请求到批处理命令里

    在批处理模式下,照常输入操作请求。操作请求将按输入的顺序添加到批处理命令里。
    关于格式化操作请求的详情,请参考 第 3.5.8 节 “在管理 CLI 里使用操作和命令”
  3. 运行批处理命令

    一旦输入了整个操作请求序列,请用 run-batch 运行这个批处理命令。
    [standalone@localhost:9999 / #] run-batch
    The batch executed successfully.
    关于可用于批处理的完整的命令列表,请参考 第 3.5.7 节 “CLI 批处理模式命令”
  4. 保存在外部文件里的批命令

    频繁运行的批处理命令可以存储在外部文件里,通过将完整文件路径作为参数传入 batch 或直接作为 run-batch 命令的参数来执行。
    您可以用文本编辑器创建批处理命令文件。每个命令都必须单独一行且 CLI 应该可以访问它。
    下面的命令将加载 myscript.txt 文件至批处理模式。这个文件里的所有命令都可以编辑或删除,您也可以插入新的命令。这个批处理会话里进行的修改不会持久化到 myscript.txt 文件里。
    [standalone@localhost:9999 /] batch --file=myscript.txt
    下面的命令将立即运行存储在文件 myscript.txt 里的批命令
    [standalone@localhost:9999 /] run-batch --file=myscript.txt
结果

输入的操作请求序列以批模式完成了。

3.5.7. CLI 批处理模式命令

这个表提供了 JBoss EAP 6 CLI 里可用的批处理命令列表。这些命令只能用于批处理模式。

表 3.2. CLI 批处理模式命令

命令名 描述
list-batch 当前批次里的命令和操作的列表。
edit-batch-line line-number edited-command 通过行号和要编辑的命令来编辑当前批处理里的行。例如: edit-batch-line 2 data-source disable --name=ExampleDS
move-batch-line fromline toline 指定您要移动的行号为第一个参数且新的位置为第二个参数来重新对批处理命令里的行进行排序。例如: move-batch-line 3 1
remove-batch-line linenumber 删除指定行上的批处理命令。例如: remove-batch-line 3
holdback-batch [batchname]
如果您突然想在 CLI 里执行批处理之外的命令,您可以使用这个命令推迟或存储当前的批处理命令。要返回已暂停批模式,只要在 CLI 命令行上再次输入 batch 就可以了。
如果在 holdback-batch 命令时您提供了 batchname,批命令将按照这个名称进行存储要返回命名的批次,请使用 batch batchname。不使用 batchname 调用 batch 命令将启动新的(未命名)的批处理。系统里只能有一个未命名的暂停批命令。
要查看暂停批命令的列表,请使用 batch -l 命令。
discard-batch 取消当前活动的批处理命令。

3.5.8. 在管理 CLI 里使用操作和命令

过程 3.12. 创建、配置和执行请求

  1. 构造操作请求

    操作请求允许和管理模型的低层交互。它们提供一种可控的方式来编辑服务器配置。操作请求由三部分组成:
    • 地址,前缀为斜杠(/)。
    • 操作名称,前缀为冒号(:)。
    • 可选的参数,包含在括号(())里。
    1. 确定地址

      配置以有地址的资源层级树型出现。每个资源节点都提供了一系列不同的操作。地址指定哪些资源可以执行操作。地址使用下面的语法:
      /node-type=node-name
      • node-type 是资源节点的类型。它映射配置 XML 文件里的元素名称。
      • node-name 是资源节点的名称。它映射配置 XML 文件里的元素的 name 属性。
      • 用斜杠(/)分隔资源树的每个级别。
      要确定所需的地址,请参考 XML 配置文件。EAP_HOME/standalone/configuration/standalone.xml 文件保存独立服务器的配置信息,EAP_HOME/domain/configuration/domain.xmlEAP_HOME/domain/configuration/host.xml 文件保存受管域的配置信息。

      例 3.3. 操作地址示例

      要执行 Logging 子系统上的操作,请使用操作请求里的下列地址:
      /subsystem=logging
      要执行 Java 数据源上的操作,请使用操作请求里的下列地址:
      /subsystem=datasources/data-source=java
    2. 确定操作

      对于不同类型的资源节点,操作会有所不同。操作使用下面的语法:
      :operation-name
      • operation-name 是要请求的操作的名称。
      在独立服务器上的任何资源地址上使用 read-operation-names 操作来列出可用的操作。

      例 3.4. 可用的操作

      要列出 Logging 子系统到所有可用的操作,在独立服务器里输入下列请求:
      [standalone@localhost:9999 /] /subsystem=logging:read-operation-names
      {
          "outcome" => "success",
          "result" => [
              "add",
              "read-attribute",
              "read-children-names",
              "read-children-resources",
              "read-children-types",
              "read-operation-description",
              "read-operation-names",
              "read-resource",
              "read-resource-description",
              "remove",
              "undefine-attribute",
              "whoami",
              "write-attribute"
          ]
      }
      
    3. 确定任何参数

      每个操作可能需要不同的参数。
      参数使用下面的语法:
      (parameter-name=parameter-value)
      • parameter-name 是参数的名称。
      • parameter-value 是参数的值。
      • 多个参数用逗号隔开(,)。
      要确定所需的参数,在资源节点上执行 read-operation-description 命令,将操作名称作为参数传入。详情请参考 例 3.5 “确定操作的参数”

      例 3.5. 确定操作的参数

      要确定 logging 子系统上的 read-children-types 操作的必需参数,请输入 read-operation-description 命令:
      [standalone@localhost:9999 /] /subsystem=logging:read-operation-description(name=read-children-types)
      {
          "outcome" => "success",
          "result" => {
              "operation-name" => "read-children-types",
              "description" => "Gets the type names of all the children under the selected resource",
              "reply-properties" => {
                  "type" => LIST,
                  "description" => "The children types",
                  "value-type" => STRING
              },
              "read-only" => true
          }
      }
      
  2. 输入完整的操作请求

    一旦确定了地址、操作和所有参数,请输入完整的操作请求。

    例 3.6. 操作请求示例

    [standalone@localhost:9999 /] /subsystem=web/connector=http:read-resource(recursive=true)
结果

管理接口执行服务器配置里的操作请求。

3.5.9. 管理 CLI 配置选项

每次 CLI 启动时都会加载其配置文件 - jboss-cli.xml。它必须位于 $EAP_HOME/bin 或者系统属性 jboss.cli.config 指定的目录。
default-controller
如果不带参数执行 connect 命令时连接的控制器的配置。

default-controller Parameters

host
控制器的主机名。默认值:localhost
port
连接控制器的端口号码。默认值为 9999。
validate-operation-requests
指定在操作请求发往控制器执行前是否检验操作请求的参数列表。类型:Boolean;默认值:true
history
这个元素包含命令和操作历史日志的配置。

history 参数

enabled
指定是否启用 history。类型:Boolean;默认值:true
file-name
存储历史日志的文件的名称。默认值是:.jboss-cli-history
file-dir
存储历史日志的目录。默认值是:$USER_HOME
max-size
历史日志文件的最大大小。默认值为 500。
resolve-parameter-values
是否在发送操作请求到控制器前解析指定为命令参数(或操作参数)的系统属性,或者让解析在服务器端进行。类型:Boolean;默认值:false
connection-timeout
用控制器建立连接所允许的时间。类型:Integer;默认值:5,000 秒。
ssl
这个元素包含用于 SSL 的密钥和信任库的配置。

ssl 参数

vault
类型:vaultType
key-store
类型:String
key-store-password
类型:String
alias
类型:String
key-password
类型:String
trust-store
类型:String
trust-store-password
类型:String
modify-trust-store
如果设置为 false,当接收到不承认的证书时 CLI 将提示用户并允许将它们存储在信任库。类型:Boolean;默认值:true

vaultType

如果既没有指定 code 也没指定 module,默认的实现将被使用。如果指定了 code 但没有指定 module,系统将在 Picketbox 模块里查找指定的类。如果 module code 都指定了,系统将在 'module' 指定的模块里查找 'code' 指定的类。
code
类型:String
module
类型:String
silent
指定信息和错误消息是否输出到终端。如果配置允许或者在命令行用 > 指定了输出目标,即使指定了 false,消息仍会用 logger 进行记录。

3.5.10. 管理 CLI 命令参考

概述

第 3.5.5 节 “用管理 CLI 获取帮助” 描述了如何访问管理 CLI 的帮助功能,包括有带有普通和上下文敏感选项的帮助对话框。对于独立服务器和域控制器,依赖于操作上下文的 help 命令都要求已建立的连接。除非连接已建立,否则这些命令不会出现在列表里。

表 3.3. 

命令 描述
batch 通过创建新的批次、或者重新激活现有的暂停的批次来启动批模式。如果没有暂停的批命令,这个命令将启动新的批次。如果存在未命名的暂停的批命令,这个命令将重新激活它。如果存在有名称的暂停的批命令,将这个批次的名称作为参数来执行命令就可以激活。
cd 根据参数修改当前的节点路径。当前的节点路径用于不包含地址部分的操作请求的地址。如某个操作请求包含了地址,所包含的地址将当作当前节点路径的相对地址。当前的节点路径可以以节点类型结尾。此时,执行指定节点名称的操作就足够了,例如 logging:read-resource。
clear 清除屏幕。
command 允许您添加、删除和列出现有的普通类型的命令。普通类型命令是分配专有节点类型的命令,它允许您执行该类型的实例的任何可用的操作。它也可以修改现有实例上类型开放的任何属性。
connect 连接到指定主机和端口上的控制器。
connection-factory 定义连接工厂。
data-source 管理 datasource 子系统里的 JDBC 数据源配置。
deploy 部署用文件路径指定的应用程序或启用资料库里现有的被禁用的应用程序。如果不带参数执行,这个命令将列出全部现有的部署。
help 显示帮助信息。它可以用 --commands 参数为给定命令提供上下文敏感的内容。
history 显示内存里的 CLI 命令历史以及启用/禁用历史扩展的状态。它可以按需要用参数来清除、禁用和启用历史扩展。
jms-queue 在 messaging 子系统里定义一个 JMS 队列。
jms-topic 在 messaging 子系统里定义一个 JMS 主题。
ls 列出节点路径的内容。在默认情况下,终端窗口会用整屏以列显示结果。-l 参数将以每行一个名字显示结果。
pwd 显示当前工作节点的完整节点路径。
quit 终止命令行界面。
read-attribute 根据参数显示受管资源属性的值和描述。
read-operation 显示指定操作的描述,未指定则列出所有的操作。
undeploy 以应用程序的名称为参数运行可以卸载应用程序。它也可以通过参数运行从资料库删除应用程序。如无参数运行则输出所有现有的部署。
version 显示应用服务器版本和环境信息。
xa-data-source 管理 datasource 子系统里的 JDBC XA 数据源配置。

3.5.11. 管理 CLI 操作参考

开放管理 CLI 里的操作

管理 CLI 里的操作可以用 第 3.6.5 节 “用管理 CLI 显示操作名称” 里描述的 read-operation-names 操作开放。这些操作描述可以用 第 3.6.4 节 “用管理 CLI 显示操作描述” 里描述的 read-operation-descriptions 操作来开放。

表 3.4. 管理 CLI 操作

操作名称 描述
add-namespace 在 namespaces 属性的表里添加命名空间前缀映射。
add-schema-location 在 schema-locations 属性的表里添加模式位置 映射。
delete-snapshot 从 snapshots 目录删除服务器配置的快照。
full-replace-deployment 添加之前上传的部署内容到可用内容列表里,替换 runtime 里具有相同名称的现有内容,并从可用列表里删除替换的内容。进一步的信息请点击链接。
list-snapshots 列出保存在 snapshots 目录里的服务器配置的快照。
read-attribute 显示所选资源的属性的值。
read-children-names 显示给定类型的资源下的所有子资源的名称。
read-children-resources 显示给定类型的资源的所有子资源的信息。
read-children-types 显示所选资源下的所有子资源的类型名称。
read-config-as-xml 读取当前的配置并以 XML 格式显示。
read-operation-description 显示给定资源上的操作的细节。
read-operation-names 显示给定资源上的所有操作的名称。
read-resource 显示模型资源的属性值以及任何子资源的基本或完整的信息。
read-resource-description 显示资源属性的描述、子资源和操作的类型。
reload 关闭所有服务并重启来重载服务器。
remove-namespace 在 namespaces 属性的表里删除命名空间前缀映射。
remove-schema-location 在 schema-locations 属性的表里删除模式位置 映射。
replace-deployment 用新的内容替换 runtime 里的内容。新的内容必须已经上传到部署的内容资料库。
resolve-expression 接受表达式或可以解析为表达式的字符串的操作,并根据本地系统属性和环境变量进行解析。
resolve-internet-address 通过一系列接口解析标准找到本地主机上的 IP 地址,如果没有匹配的 IP 地址则运行失败。
server-set-restart-required 让服务器进入需要重启的模式
shutdown 通过调用 System.exit(0) 关闭服务器。
start-servers 启动受管域里配置的且当前没有运行的所有服务器。
stop-servers 停止当前运行在受管域里的所有服务器。
take-snapshot 创建服务器配置的快照并保存在 snapshots 目录。
upload-deployment-bytes 指定所包含的字节队列上的部署内容应该添加到部署内容资料库。请注意,这个操作没有指明内容应该部署至 runtime。
upload-deployment-stream 指定所包含的输入流索引上可用的部署内容应该添加到部署内容资料库。请注意,这个操作没有指明内容应该部署到 runtime。
upload-deployment-url 指定所包含的 URL 上可用的部署内容应该添加到部署内容资料库。请注意,这个操作没有指明内容应该部署至 runtime。
validate-address 检验操作的地址。
write-attribute 设置所选资源的属性的值。

3.6. 管理 CLI 操作

3.6.1. 用管理 CLI 显示资源属性

概述

read-attribute 操作是一个用来读取选定属性的当前 runtime 值的全局操作。它可以用来只开放用户设置的值而忽略任何默认或未定义的值。请求属性包括下列参数。

请求属性

name
获取所选资源下的值的属性的名称。
include-defaults
布尔型参数,可以设置为 false 来限制操作结果,只显示用户设置的属性并忽略默认的值。

过程 3.13. 显示所选属性的当前 Runtime 值

read-attribute 操作的优势是开放专有属性的当前 runtime 值的能力。用 read-resource 操作可获得类似的结果,但只能通过 include-runtime 请求属性,而且只作为该节点的所有可用资源的列表的一部分。read-attribute 操作用于细颗粒度的属性查询,如下例所示。

例 3.7. 运行 read-attribute 操作来开放公共的接口 IP。

如果您知道要开放的属性的名称,您可以使用 read-attribute 来获取当前 runtime 里的确切的值。
[standalone@localhost:9999 /] /interface=public:read-attribute(name=resolved-address)
{
    "outcome" => "success",
    "result" => "127.0.0.1"
}

resolved-address 属性是一个 runtime 值,所以不会显示在标准的 read-resource 操作的结果里。
[standalone@localhost:9999 /] /interface=public:read-resource                        
{
    "outcome" => "success",
    "result" => {
        "any" => undefined,
        "any-address" => undefined,
        "any-ipv4-address" => undefined,
        "any-ipv6-address" => undefined,
        "inet-address" => expression "${jboss.bind.address:127.0.0.1}",
        "link-local-address" => undefined,
        "loopback" => undefined,
        "loopback-address" => undefined,
        "multicast" => undefined,
        "name" => "public",
        "nic" => undefined,
        "nic-match" => undefined,
        "not" => undefined,
        "point-to-point" => undefined,
        "public-address" => undefined,
        "site-local-address" => undefined,
        "subnet-match" => undefined,
        "up" => undefined,
        "virtual" => undefined
    }
}

要显示 resolved-address 和其他 runtime 值,您必须使用 include-runtime 请求属性。
[standalone@localhost:9999 /] /interface=public:read-resource(include-runtime=true)
{
    "outcome" => "success",
    "result" => {
        "any" => undefined,
        "any-address" => undefined,
        "any-ipv4-address" => undefined,
        "any-ipv6-address" => undefined,
        "inet-address" => expression "${jboss.bind.address:127.0.0.1}",
        "link-local-address" => undefined,
        "loopback" => undefined,
        "loopback-address" => undefined,
        "multicast" => undefined,
        "name" => "public",
        "nic" => undefined,
        "nic-match" => undefined,
        "not" => undefined,
        "point-to-point" => undefined,
        "public-address" => undefined,
        "resolved-address" => "127.0.0.1",
        "site-local-address" => undefined,
        "subnet-match" => undefined,
        "up" => undefined,
        "virtual" => undefined
    }
}

结果

显示当前的 runtime 属性值。

3.6.2. 在管理 CLI 里显示活动用户

介绍

whoami 操作是用于确定当前活动用户的全局操作。这个操作开放了用户名标识及它们分配的区。管理员可以用 whoami 操作来管理多个区上的多个用户帐号,或者跟踪具有多个终端会话和用户帐号的域实例上的活动用户。

过程 3.14. 在管理 CLI 里用 whoami 操作显示活动用户

  • 运行 whoami 操作

    在管理 CLI 里,请用 whoami 操作来显示活动的用户帐号。
    [standalone@localhost:9999 /] :whoami
    下面的例子使用了独立服务器实例里的 whoami 操作来显示活动用户 username,以及它所分配的 ManagementRealm 区。

    例 3.8. 在独立实例里使用 whoami

    [standalone@localhost:9999 /]:whoami
    {
        "outcome" => "success",
        "result" => {"identity" => {
            "username" => "username",
            "realm" => "ManagementRealm"
        }}
    }
    
    
结果

显示当前的活动用户帐号。

3.6.3. 在管理 CLI 里显示系统和服务器信息

过程 3.15. 在管理 CLI 里显示系统和服务器信息

  • 运行 version 命令

    在管理 CLI 里,输入 version 命令:
    [domain@localhost:9999 /] version
结果

显示应用服务器版本和环境信息。

3.6.4. 用管理 CLI 显示操作描述

过程 3.16. 在管理 CLI 里执行命令

  • 运行 read-operation-description 操作

    在管理 CLI 里,使用 read-operation-description 来显示操作信息。这个操作要求键-值格式的其他参数以指定要显示的操作。关于操作请求的详情,请参考 第 3.5.8 节 “在管理 CLI 里使用操作和命令”
    [standalone@localhost:9999 /]:read-operation-description(name=name-of-operation)

例 3.9. 显示 list-snapshots 操作的描述

下面的例子显示了描述 list-snapshots 操作的方法。
[standalone@localhost:9999 /] :read-operation-description(name=list-snapshots)
{
    "outcome" => "success",
    "result" => {
        "operation-name" => "list-snapshots",
        "description" => "Lists the snapshots",
        "request-properties" => {},
        "reply-properties" => {
            "type" => OBJECT,
            "value-type" => {
                "directory" => {
                    "type" => STRING,
                    "description" => "The directory where the snapshots are stored",
                    "expressions-allowed" => false,
                    "required" => true,
                    "nillable" => false,
                    "min-length" => 1L,
                    "max-length" => 2147483647L
                },
                "names" => {
                    "type" => LIST,
                    "description" => "The names of the snapshots within the snapshots directory",
                    "expressions-allowed" => false,
                    "required" => true,
                    "nillable" => false,
                    "value-type" => STRING
                }
            }
        },
        "access-constraints" => {"sensitive" => {"snapshots" => {"type" => "core"}}},
        "read-only" => false
    }
}
结果

显示所选操作的描述。

3.6.5. 用管理 CLI 显示操作名称

过程 3.17. 在管理 CLI 里执行命令

例 3.10. 用管理 CLI 显示操作名称

下面的例子显示了描述 read-operation-names 操作的方法。
[standalone@localhost:9999 /]:read-operation-names
{
    "outcome" => "success",
    "result" => [
        "add-namespace",
        "add-schema-location",
        "delete-snapshot",
        "full-replace-deployment",
        "list-snapshots",
        "read-attribute",
        "read-children-names",
        "read-children-resources",
        "read-children-types",
        "read-config-as-xml",
        "read-operation-description",
        "read-operation-names",
        "read-resource",
        "read-resource-description",
        "reload",
        "remove-namespace",
        "remove-schema-location",
        "replace-deployment",
        "resolve-expression",
        "resolve-internet-address",
        "server-set-restart-required",
        "shutdown",
        "take-snapshot",
        "undefine-attribute",
        "upload-deployment-bytes",
        "upload-deployment-stream",
        "upload-deployment-url",
        "validate-address",
        "validate-operation",
        "whoami",
        "write-attribute"
    ]
}
结果

显示可用的操作名称。

3.6.6. 用管理 CLI 显示可用资源

概述

read-resource 操作是用来读取资源值的全局操作。它可以用来开放当前节点或子节点额资源的基本或完整的信息,以及扩展或限制操作结果的作用域的请求属性。请求属性包含下列参数。

请求属性

recursive
是否递归地包含子资源的完整信息。
recursive-depth
应该包含子节点资源信息的深度。
proxies
是否在递归查询里包含远程资源。例如,包含域控制器查询里从主机控制器的主机级别资源。
include-runtime
是否在响应里包含 runtime 属性,如不是来自持久性配置的属性值。这个请求属性默认是 false。
include-defaults
这是一个 boolean 型的请求属性,它启用或禁用默认属性的读取。当设置为 false 时,只返回用户设置的属性,忽略了那些未定义的属性。

过程 3.18. 在管理 CLI 里执行命令

  1. 运行 read-resource 操作

    在管理 CLI 里,请用 read-resource 操作来显示可用的资源。
    [standalone@localhost:9999 /]:read-resource
    下面的例子展示了在独立服务器里如何使用 read-resource 操作来开放普通资源信息。结果类似于 standalone.xml 配置文件,显示系统资源、扩展、接口和为服务器实例安装和配置的子系统。它们可以进一步进行直接查询。

    例 3.11. 在根级别使用 read-resource 操作

    [standalone@localhost:9999 /]:read-resource
    {
        "outcome" => "success",
        "result" => {
            "deployment" => undefined,
            "deployment-overlay" => undefined,
            "management-major-version" => 1,
            "management-micro-version" => 0,
            "management-minor-version" => 4,
            "name" => "longgrass",
            "namespaces" => [],
            "product-name" => "EAP",
            "product-version" => "6.3.0.GA",
            "release-codename" => "Janus",
            "release-version" => "7.2.0.Final-redhat-3",
            "schema-locations" => [],
            "system-property" => undefined,
            "core-service" => {
                "management" => undefined,
                "service-container" => undefined,
                "server-environment" => undefined,
                "platform-mbean" => undefined
            },
            "extension" => {
                "org.jboss.as.clustering.infinispan" => undefined,
                "org.jboss.as.connector" => undefined,
                "org.jboss.as.deployment-scanner" => undefined,
                "org.jboss.as.ee" => undefined,
                "org.jboss.as.ejb3" => undefined,
                "org.jboss.as.jaxrs" => undefined,
                "org.jboss.as.jdr" => undefined,
                "org.jboss.as.jmx" => undefined,
                "org.jboss.as.jpa" => undefined,
                "org.jboss.as.jsf" => undefined,
                "org.jboss.as.logging" => undefined,
                "org.jboss.as.mail" => undefined,
                "org.jboss.as.naming" => undefined,
                "org.jboss.as.pojo" => undefined,
                "org.jboss.as.remoting" => undefined,
                "org.jboss.as.sar" => undefined,
                "org.jboss.as.security" => undefined,
                "org.jboss.as.threads" => undefined,
                "org.jboss.as.transactions" => undefined,
                "org.jboss.as.web" => undefined,
                "org.jboss.as.webservices" => undefined,
                "org.jboss.as.weld" => undefined
            },
            "interface" => {
                "management" => undefined,
                "public" => undefined,
                "unsecure" => undefined
            },
            "path" => {
                "jboss.server.temp.dir" => undefined,
                "user.home" => undefined,
                "jboss.server.base.dir" => undefined,
                "java.home" => undefined,
                "user.dir" => undefined,
                "jboss.server.data.dir" => undefined,
                "jboss.home.dir" => undefined,
                "jboss.server.log.dir" => undefined,
                "jboss.server.config.dir" => undefined,
                "jboss.controller.temp.dir" => undefined
            },
            "socket-binding-group" => {"standard-sockets" => undefined},
            "subsystem" => {
                "logging" => undefined,
                "datasources" => undefined,
                "deployment-scanner" => undefined,
                "ee" => undefined,
                "ejb3" => undefined,
                "infinispan" => undefined,
                "jaxrs" => undefined,
                "jca" => undefined,
                "jdr" => undefined,
                "jmx" => undefined,
                "jpa" => undefined,
                "jsf" => undefined,
                "mail" => undefined,
                "naming" => undefined,
                "pojo" => undefined,
                "remoting" => undefined,
                "resource-adapters" => undefined,
                "sar" => undefined,
                "security" => undefined,
                "threads" => undefined,
                "transactions" => undefined,
                "web" => undefined,
                "webservices" => undefined,
                "weld" => undefined
            }
        }
    }
    
    
  2. 针对子节点运行 read-resource 操作

    read-resource 操作可以查询根节点的子节点。操作的结构首先定义要开放的节点,然后附加这个操作来运行。
    [standalone@localhost:9999 /]/subsystem=web/connector=http:read-resource
    在下面的例子里,通过指引 read-resource 操作到专有的 Web 子系统节点来开放 Web 子系统组件的专有资源信息。

    例 3.12. 开放根结点的子节点资源

    [standalone@localhost:9999 /] /subsystem=web/connector=http:read-resource                      
    {
        "outcome" => "success",
        "result" => {
            "configuration" => undefined,
            "enable-lookups" => false,
            "enabled" => true,
            "executor" => undefined,
            "max-connections" => undefined,
            "max-post-size" => 2097152,
            "max-save-post-size" => 4096,
            "name" => "http",
            "protocol" => "HTTP/1.1",
            "proxy-name" => undefined,
            "proxy-port" => undefined,
            "redirect-port" => 443,
            "scheme" => "http",
            "secure" => false,
            "socket-binding" => "http",
            "ssl" => undefined,
            "virtual-server" => undefined
        }
    }
    
    
    相同的结果可以用 cd 命令进入子节点并直接运行 read-resource 操作获得。

    例 3.13. 通过修改目录开放子节点资源

    [standalone@localhost:9999 /] cd subsystem=web
    
    [standalone@localhost:9999 subsystem=web] cd connector=http
    
    [standalone@localhost:9999 connector=http] :read-resource
    {
        "outcome" => "success",
        "result" => {
            "configuration" => undefined,
            "enable-lookups" => false,
            "enabled" => true,
            "executor" => undefined,
            "max-connections" => undefined,
            "max-post-size" => 2097152,
            "max-save-post-size" => 4096,
            "name" => "http",
            "protocol" => "HTTP/1.1",
            "proxy-name" => undefined,
            "proxy-port" => undefined,
            "redirect-port" => 443,
            "scheme" => "http",
            "secure" => false,
            "socket-binding" => "http",
            "ssl" => undefined,
            "virtual-server" => undefined
        }
    }
    
    
  3. 使用 recursive 参数在结果里包含活动的属性值。

    recursive 参数可以用来开放所有属性的值,包括非持久性的值、在启动时传入的值或其他在 runtime 模型里活动的属性。
    [standalone@localhost:9999 /]/interface=public:read-resource(include-runtime=true)
    和之前的例子相比, include-runtime 请求属性会开放其他的活动属性,如发送的字节和 HTTP 连接器接收的字节。

    例 3.14. 用 include-runtime 参数开放其他活动的属性值。

    [standalone@localhost:9999 /] /subsystem=web/connector=http:read-resource(include-runtime=true)
    {
        "outcome" => "success",
        "result" => {
            "any" => undefined,
            "any-address" => undefined,
            "any-ipv4-address" => undefined,
            "any-ipv6-address" => undefined,
            "inet-address" => expression "${jboss.bind.address:127.0.0.1}",
            "link-local-address" => undefined,
            "loopback" => undefined,
            "loopback-address" => undefined,
            "multicast" => undefined,
            "name" => "public",
            "nic" => undefined,
            "nic-match" => undefined,
            "not" => undefined,
            "point-to-point" => undefined,
            "public-address" => undefined,
            "resolved-address" => "127.0.0.1",
            "site-local-address" => undefined,
            "subnet-match" => undefined,
            "up" => undefined,
            "virtual" => undefined
        }
    }
    
    

3.6.7. 用管理 CLI 显示可用资源的描述

过程 3.19. 在管理 CLI 里执行命令

  1. 运行 read-resource-description 操作

    在管理 CLI 里,使用 read-resource-description 来读取和显示可用资源。关于操作请求的详情,请参考 第 3.5.8 节 “在管理 CLI 里使用操作和命令”
    [standalone@localhost:9999 /]:read-resource-description
  2. 使用可选参数

    read-resource-description 操作允许使用其他参数。
    1. 使用 operations 参数来包含资源操作的描述。
      [standalone@localhost:9999 /]:read-resource-description(operations=true)
    2. 使用 inherited 参数可以包含或排除资源继承操作的描述。默认状态是 true。
      [standalone@localhost:9999 /]:read-resource-description(inherited=false)
    3. 使用 recursive 参数来包含子资源的递归描述。
      [standalone@localhost:9999 /]:read-resource-description(recursive=true)
    4. 使用 locale 参数来获取资源描述。如果为 null 则使用默认的 locale。
      [standalone@localhost:9999 /]:read-resource-description(locale=true)
结果

显示可用资源的描述。

3.6.8. 用管理 CLI 重载应用服务器

在管理 CLI 里使用 reload 操作来关闭所有服务并重启 runtime。在完成 reload 操作后管理 CLI 将自动重连。
关于操作请求的更多细节,请参考 第 3.5.8 节 “在管理 CLI 里使用操作和命令”

例 3.15. 重载应用服务器

[standalone@localhost:9999 /]:reload
{"outcome" => "success"}

3.6.9. 用管理 CLI 关闭应用服务器

过程 3.20. 关闭应用服务器

  • 运行 shutdown 操作

    • 在管理 CLI 里,使用 shutdown 操作通过 System.exit(0) 系统调用来关闭服务器。关于操作请求的详情,请参考 第 3.5.8 节 “在管理 CLI 里使用操作和命令”
      • 在独立模式下,请使用下列命令:
        [standalone@localhost:9999 /]:shutdown
      • 在域模式下,请使用下列命令及合适的主机名:
        [domain@localhost:9999 /]/host=master:shutdown
    • 要连接到附加的 CLI 实例并关闭服务器,请执行下列命令:
      jboss-cli.sh --connect command=:shutdown
      
    • 要连接到远程的 CLI 实例并关闭服务器,请执行下列命令:
      [disconnected /] connect IP_ADDRESS
      Connected to IP_ADDRESS:PORT_NUMBER
      [192.168.1.10:9999 /] :shutdown
      
      用实例的 IP 地址替换 IP_ADDRESS
结果

服务器被关闭。管理 CLI 将断开连接,因为 runtime 已是不可用的。

3.6.10. 使用管理 CLI 配置属性

介绍

write-attribute 操作是用来写入或修改资源属性的全局操作。您可以使用这个操作来进行持久性修改并修改管理的服务器实例的配置设置。请求属性包含下列参数。

请求属性

name
需要设置值的所选资源属性的名称。
value
所选资源里属性的值。如果底层模型支持 null 值的话可以为 null。

过程 3.21. 使用管理 CLI 配置资源属性

  • 运行 write-attribute 操作

    在管理 CLI 里,使用 write-attribute 操作修改资源属性的值。这个擦作可以运行在资源的子节点或管理 CLI 的根节点上(指定完整资源路径)。

例 3.16. 用 write-attribute 操作禁用部署扫描器。

下面的例子使用了 write-attribute 操作来禁用部署扫描器。这个操作从根节点运行,使用 Tab Completion 来协助填充正确的资源路径。
[standalone@localhost:9999 /] /subsystem=deployment-scanner/scanner=default:write-attribute(name=scan-enabled,value=false)
{"outcome" => "success"}

操作的结果可以直接用 read-attribute 操作确认。
[standalone@localhost:9999 /] /subsystem=deployment-scanner/scanner=default:read-attribute(name=scan-enabled)
{
    "outcome" => "success",
    "result" => false
}

read-resource 操作列出节点的所有可用资源属性可以确认资源。在下列例子里,这个特定的配置展示了 scan-enabled 属性被设置为 false
[standalone@localhost:9999 /] /subsystem=deployment-scanner/scanner=default:read-resource                                 
{
    "outcome" => "success",
    "result" => {
        "auto-deploy-exploded" => false,
        "auto-deploy-xml" => true,
        "auto-deploy-zipped" => true,
        "deployment-timeout" => 600,
        "path" => "deployments",
        "relative-to" => "jboss.server.base.dir",
        "scan-enabled" => false,
        "scan-interval" => 5000
    }
}

结果

更新了资源属性

3.6.11. 用管理 CLI 配置系统属性

过程 3.22. 用管理 CLI 配置系统属性

  1. 启动 JBoss EAP 服务器。
  2. 使用适合操作系统的命令启动管理 CLI
    对于 Linux:
    EAP_HOME/bin/jboss-cli.sh --connect
    对于 Windows:
    EAP_HOME\bin\jboss-cli.bat --connect
  3. 添加系统属性。
    使用的命令取决于服务器是否是独立服务器还是运行在受管域里。如果您运行的是受管域,您可以添加任何系统属性到运行在这个域里的任何或所有服务器里。
    • 用下列语法在独立服务器上添加一个系统属性:
      /system-property=PROPERTY_NAME:add(value=PROPERTY_VALUE)

      例 3.17. 添加系统属性到独立服务器

      [standalone@localhost:9999 /] /system-property=property.mybean.queue:add(value=java:/queue/MyBeanQueue)
      {"outcome" => "success"}
      
    • 用下列语法在受管域里的所有主机和服务器上添加一个系统属性:
      /system-property=PROPERTY_NAME:add(value=PROPERTY_VALUE)

      例 3.18. 添加系统属性到受管域里的所有服务器

      [domain@localhost:9999 /] /system-property=property.mybean.queue:add(value=java:/queue/MyBeanQueue)
      {
          "outcome" => "success",
          "result" => undefined,
          "server-groups" => {"main-server-group" => {"host" => {"master" => {
              "server-one" => {"response" => {"outcome" => "success"}},
              "server-two" => {"response" => {"outcome" => "success"}}
          }}}}
      }
      
    • 用下列语法在受管域里的主机及其服务器实例上添加一个系统属性:
      /host=master/system-property=PROPERTY_NAME:add(value=PROPERTY_VALUE)

      例 3.19. 添加系统属性到域里的主机及其服务器

      [domain@localhost:9999 /] /host=master/system-property=property.mybean.queue:add(value=java:/queue/MyBeanQueue)
      {
          "outcome" => "success",
          "result" => undefined,
          "server-groups" => {"main-server-group" => {"host" => {"master" => {
              "server-one" => {"response" => {"outcome" => "success"}},
              "server-two" => {"response" => {"outcome" => "success"}}
          }}}}
      }
      
    • 用下列语法添加一个系统属性到受管域里的服务器实例:
      /host=master/server-config=server-one/system-property=PROPERTY_NAME:add(value=PROPERTY_VALUE)

      例 3.20. 添加系统属性到受管域里的服务器实例

      [domain@localhost:9999 /] /host=master/server-config=server-one/system-property=property.mybean.queue:add(value=java:/queue/MyBeanQueue)
      {
          "outcome" => "success",
          "result" => undefined,
          "server-groups" => {"main-server-group" => {"host" => {"master" => {"server-one" => {"response" => {"outcome" => "success"}}}}}}
      }
      
      
  4. 读取系统属性。
    所使用的命令取决于服务器是否是独立服务器还是运行在受管域里。
    • 用下列语法从独立服务器读取系统属性:
      /system-property=PROPERTY_NAME:read-resource

      例 3.21. 从独立服务器读取系统属性

      [standalone@localhost:9999 /] /system-property=property.mybean.queue:read-resource
      {
          "outcome" => "success",
          "result" => {"value" => "java:/queue/MyBeanQueue"}
      }
      
      
    • 用下列语法在受管域里的所有主机和服务器上读取系统属性:
      /system-property=PROPERTY_NAME:read-resource

      例 3.22. 从受管域里的所有服务器上读取系统属性

      [domain@localhost:9999 /] /system-property=property.mybean.queue:read-resource
      {
          "outcome" => "success",
          "result" => {
              "boot-time" => true,
              "value" => "java:/queue/MyBeanQueue"
          }
      }
      
    • 用下列语法从受管域里的主机及其服务器实例里读取系统属性:
      /host=master/system-property=PROPERTY_NAME:read-resource

      例 3.23. 从受管域里的主机及其服务器读取系统属性

      [domain@localhost:9999 /] /host=master/system-property=property.mybean.queue:read-resource
      {
          "outcome" => "success",
          "result" => {
              "boot-time" => true,
              "value" => "java:/queue/MyBeanQueue"
          }
      }
      
      
    • 用下列语法从受管域里的服务器实例里读取系统属性:
      /host=master/server-config=server-one/system-property=PROPERTY_NAME:read-resource

      例 3.24. 从受管域里的服务器实例读取系统属性

      [domain@localhost:9999 /] /host=master/server-config=server-one/system-property=property.mybean.queue:read-resource
      {
          "outcome" => "success",
          "result" => {
              "boot-time" => true,
              "value" => "java:/queue/MyBeanQueue"
          }
      }
      
  5. 删除系统属性。
    所使用的命令取决于服务器是否是独立服务器还是运行在受管域里。
    • 用下列语法从独立服务器删除系统属性:
      /system-property=PROPERTY_NAME:remove

      例 3.25. 从独立服务器删除系统属性

      [standalone@localhost:9999 /] /system-property=property.mybean.queue:remove
      {"outcome" => "success"}
      
    • 用下列语法从受管域里的所有主机和服务器里删除系统属性:
      /system-property=PROPERTY_NAME:remove

      例 3.26. 从受管域里的所有主机和服务器里删除系统属性

      [domain@localhost:9999 /] /system-property=property.mybean.queue:remove
      {
          "outcome" => "success",
          "result" => undefined,
          "server-groups" => {"main-server-group" => {"host" => {"master" => {
              "server-one" => {"response" => {"outcome" => "success"}},
              "server-two" => {"response" => {"outcome" => "success"}}
          }}}}
      }
      
      
    • 用下列语法从受管域里的主机及其服务器实例里删除系统属性:
      /host=master/system-property=PROPERTY_NAME:remove

      例 3.27. 从受管域里的主机及其实例里删除系统属性

      [domain@localhost:9999 /] /host=master/system-property=property.mybean.queue:remove
      {
          "outcome" => "success",
          "result" => undefined,
          "server-groups" => {"main-server-group" => {"host" => {"master" => {
              "server-one" => {"response" => {"outcome" => "success"}},
              "server-two" => {"response" => {"outcome" => "success"}}
          }}}}
      }
      
      
    • 用下列语法从受管域里的服务器实例里删除系统属性:
      /host=master/server-config=server-one/system-property=PROPERTY_NAME:remove

      例 3.28. 从受管域里的服务器里删除系统属性

      [domain@localhost:9999 /] /host=master/server-config=server-one/system-property=property.mybean.queue:remove
      {
          "outcome" => "success",
          "result" => undefined,
          "server-groups" => {"main-server-group" => {"host" => {"master" => {"server-one" => {"response" => {"outcome" => "success"}}}}}}
      }
      
      

3.7. 管理 CLI 命令历史

3.7.1. 使用管理 CLI 命令历史

应用服务器安装时会默认启用管理 CLI 的历史命令功能。这个历史记录既在活动的 CLI 会话的易变内存里保持一条记录,也附加内容在自动保存在用户的主目录的 .jboss-cli-history 日志文件上。这个历史记录文件默认是记录最多 500 条 CLI 命令。
history 命令自身将返回当前会话的历史记录,或用其他参数将禁用、启用或清除会话内存里的历史记录。管理 CLI 也可以通过键盘上的箭头来在命令和操作的历史记录里前进或后退。

3.7.2. 显示管理 CLI 命令历史

过程 3.23. 显示管理 CLI 命令历史

  • 运行 history 命令

    在管理 CLI 里,输入 history 命令:
    [standalone@localhost:9999 /] history
结果

在 CLI 启动或历史清除命令显示后保存在内存里的 CLI 命令历史。

3.7.3. 清除管理 CLI 命令历史

过程 3.24. 清除管理 CLI 命令历史

  • 运行 history --clear 命令

    在管理 CLI 里,输入 history --clear 命令:
    [standalone@localhost:9999 /] history --clear
结果

自 CLI 启动后记录的命令历史将从会话内存里删除。这些命令历史仍然保存在用户主目录的 .jboss-cli-history 文件里。

3.7.4. 禁用管理 CLI 命令历史

过程 3.25. 禁用管理 CLI 命令历史

  • 运行 history --disable 命令

    在管理 CLI 里,输入 history --disable 命令:
    [standalone@localhost:9999 /] history --disable
结果

CLI 里执行的命令不会记录在内存里或保存在用户主目录的 .jboss-cli-history 文件里。

3.7.5. 启用管理 CLI 命令历史

过程 3.26. 启用管理 CLI 命令历史

  • 运行 history --enable 命令

    在管理 CLI 里,输入 history --enable 命令:
    [standalone@localhost:9999 /] history --enable
结果

CLI 里执行的命令会记录在内存里并保存在用户主目录的 .jboss-cli-history 文件里。

3.8. 管理接口审计日志

3.8.1. 关于管理接口审计日志

启用审计日志后,通过管理 CLI 执行的操作将在审计日志记录。不管这些操作是否通过管理控制台、管理 CLI 还是自定义的接口执行,都会登记审计日志。日志记录可以输出到文件里或转发到 Syslog 服务器,也可以两者都进行。在默认情况下,审计日志是禁用的。
日志数据以 JSON 格式输出,并有几个配置选项可以影响日志里的操作及日志条目的格式。
在存储日志之前,格式器和处理程序会先处理日志条目。格式器指定日志条目的格式,而处理程序输出记录到指定的目的地。目前只有一个可用的格式器,它以 JSON 格式输出条目。

注意

审计日志只能通过管理 CLI 进行配置。

3.8.2. 从管理 CLI 里启用管理接口的审计日志

要在管理 CLI 启用审计日志,请使用下列命令。
/core-service=management/access=audit/logger=audit-log:write-attribute(name=enabled,value=true)
审计日志是预配置输出到 EAP_HOME/standalone/data/audit-log.log 里的。

3.8.3. 关于管理接口的审计日志格式器

格式器指定日志条目的格式。

表 3.5. JSON 格式器字段

属性 描述
include-date 布尔值,它定义格式化日志记录是否包含时间戳。
date-separator 包含分隔日期和格式化日志信息的字符的字符串。如果 include-date=false 则被忽略。
date-format 用于时间戳的 java.text.SimpleDateFormat.可以时别的日期格式。如果 include-date=false 则被忽略。
compact 如果为 true,它将在一行里格式化 JSON 信息。因为仍有包含新行符的值,所以如果需要在同一行里容纳整个记录,可以设置 escape-new-lineescape-control-characterstrue
escape-control-characters 如果为 true,它将所有带有八进制 ASCII 字符的控制字符(带有十进制值 < 32 的 ASCII 条目)转义;例如新行将转义为 '#012'。如果它为 true,它将覆盖 escape-new-line=false
escape-new-line 如果为 true 会将所有带有八进制的 ASCII 代码的新行转义,例如 #012

3.8.4. 关于管理接口的审计日志文件处理程序

文件处理程序通过参数来指定哪些日志记录输出到文件里。它还定义格式器、文件名和路径。

表 3.6. 文件处理程序的审计日志字段

属性 描述 只读的
formatter 用来格式化日志记录的 JSON 格式器的名称。 False
path 审计日志文件的路径。 False
relative-to 之前的命名路径的名称,或者系统提供的标准路径中的一个。如果提供了 relative-to,path 属性的值将作为这个属性指定的路径的相对路径对待。 False
failure-count 初始化处理程序前记录日志失败的次数。 True
max-failure-count 禁用这个处理程序前记录日志失败的最多次数。 False
disabled-due-to-failure true 表示如果登记日志失败则禁用处理程序。 True

3.8.5. 关于管理接口的审计日志 Syslog 处理程序

Syslog 处理程序通过参数指定哪些审计日志条目被发送到 Syslog 服务器,特别是 Syslog 服务器侦听的的主机名和端口。
发送审计日志到 Syslog 服务器比本地文件或本地 Syslog 服务器提供了更安全的选项。您可以定义多个 Syslog 处理程序。
Syslog 服务器有不同的实现,所以并非所有设置都可应用到所有的 Syslog 服务器上。我们已用 rsyslog syslog 实现进行了测试。引用的 RFC 是:
  • http://www.ietf.org/rfc/rfc3164.txt
  • http://www.ietf.org/rfc/rfc5424.txt
  • http://www.ietf.org/rfc/rfc6587.txt

表 3.7. Syslog 处理程序字段

字段 描述 只读的值
formatter 用来格式化日志记录的格式器的名称。 False
failure-count 初始化处理程序前记录日志失败的次数。 True
max-failure-count 禁用这个处理程序前记录日志失败的最多次数。 False
disabled-due-to-failure True 表示如果登记日志失败则禁用处理程序。 True
syslog-format Syslog 格式:RFC-5424RFC-3164 False
max-length 日志消息的最大长度(字节),包括头部信息。如果没有定义,syslog-formatRFC3164 时它默认为 1024 字节,而 syslog-formatRFC5424 时它默认为 2048 字节。 False.
truncate 如果消息长度超过最大字节数,是否要截短(包括头部信息)。如果为 false,消息将即兴分隔然后用相同的头部值来发送。 False

3.8.6. 启用发送到 Syslog 服务器的管理接口审计日志

注意

如果要应用修改到受管域,请添加前缀 /host=HOST_NAME/core-service 命令上。

过程 3.27. 启用发送到 Syslog 服务器的日志

  1. 创建一个名为 msyslog 的 syslog 处理程序

    [standalone@localhost:9999 /]batch
    [standalone@localhost:9999 /]/core-service=management/access=audit/syslog-handler=mysyslog:add(formatter=json-formatter)
    [standalone@localhost:9999 /]/core-service=management/access=audit/syslog-handler=mysyslog/protocol=udp:add(host=localhost,port=514)
    [standalone@localhost:9999 /]run-batch
  2. 在 syslog 处理程序里添加一个引用。

    [standalone@localhost:9999 /]/core-service=management/access=audit/logger=audit-log/handler=mysyslog:add
结果

管理接口的审计日志登记在 syslog 服务器上。

3.8.7. 管理接口的审计日志选项

除了启用和禁用管理接口审计日志,还有其他可用的配置选项。

配置选项

log-boot
如果为 true,引导服务器时的管理操作将记录审计日志。如果为 false 则不会记录日志。默认为 false
log-read-only
如果为 true,所有的操作都将记录审计日志。如果为 false,只有修改了模型的操作会记录日志。默认为 false

3.8.8. 管理接口的审计日志字段

表 3.8. 管理接口的审计日志字段

字段名称 描述
type 它的值如果为 core,表示是一个管理操作;如果为 jmx,表示它来自 JMX 在系统(关于 JMX 子系统的审计日志请参考 JMX 子系统部分)。
r/o 如果操作没有修改管理模型则为 true,否则为 false
booting 如果操作是在引导过程中执行的则为 true,如果是在服务器启动并运行后执行的则为 false
version JBoss EAP 实例的版本号码。
user 已验证用户的用户名。如果和运行的服务器相同的主机为这个操作登记了日志,它将使用特殊的 $local 用户。
domainUUID 当所有操作从域控制器传播到服务器、从主机控制器和从主机控制器服务器时,链接所有操作的标识符。
access 它可以是下列值之一:NATIVE、HTTP、JMX。NATIVE - 操作通过原生管理接口进行,如 CLI。HTTP - 操作通过域 HTTP 接口进行,例如域控制台。JMX - 操作通过 JMX 子系统进行。关于如何配置 JMX 的审计日志,请参考 JMX 文档。
remote-address 执行这个操作的客户的地址。
success 如果操作成功则为 true,如果回滚则为 false
ops 被执行的操作。这是一个序列化到 JSON 的操作的列表。在引导时这是解析 XML 导致的所有操作。引导完成后,这个列表通常只包含单个条目。

第 4 章 用户管理

4.1. 用户创建

4.1.1. 为管理接口添加用户

介绍

JBoss EAP 6 里的管理界面默认是设置了安全性的,因为一开始没有可用的用户帐号,除非你是用图形安装程序安装的。对于因简单配置错误而可能引起来自远程系统的攻击来说,这是一个预防措施。本地的非 HTTP 访问是受 SASL 机制保护的,就是当客户从 localhost 第一次连接时客户和服务器间都进行协商。

这个任务描述了如何创建初始的管理性用户,它可以使用基于 WEB 的管理控制台和管理 CLI 的远程实例来从远程系统上配置和管理 JBoss EAP 6。

注意

和 JBoss EAP 6 的 HTTP 通讯被当作是远程访问,即使这种通讯发生在本地主机。因此,你必须创建至少一个用户以能够使用管理控制台。如果你试图在添加用户前访问管理控制台,你将接收到一个错误,因为它在用户创建后才会被部署。

过程 4.1. 为远程管理界面创建初始管理性用户

  1. 调用 add-user.shadd-user.bat 脚本。

    进入 EAP_HOME/bin/ 目录。根据你的操作系统调用合适的脚本。
    Red Hat Enterprise Linux
    [user@host bin]$ ./add-user.sh
    Microsoft Windows Server
    C:\bin>  add-user.bat
  2. 选择添加一个管理用户。

    点击 ENTER 选择默认选项 a 来添加一个管理用户。这个用户被添加到 ManagementRealm 并被授权通过基于 web 的管理控制台或基于命令行的管理 CLI 来执行管理操作。另外一个选项 b 则添加一个用户到 ApplicationRealm,且未提供特殊的权限。该区域(Realm)用于应用程序。
  3. 输入用户名和密码。

    遇到提示时输入用户名和密码,系统会提示您确认密码。
  4. 输入您的组信息

    添加用户所属的组或组群。如果用户属于多个组,请输入用逗号隔开的列表。如果不属于任何组,请留空。
  5. 获取信息并确认。

    系统会提示您确认信息。如果正确,请输入 yes
  6. 选择用户是否代表一个远程 JBoss EAP 6 服务器实例。

    除了管理员以外,偶尔需要在 ManagementRealm 里添加到 JBoss EAP 6 里的是代表其他 EAP 实例的用户,它需要通过验证作为成员加入到群集。下一个提示允许你指定所添加的用户。如果你选择 yes,你将得到一个 hashed secret 值,代表用户的密码,这将需要添加到不同的配置文件里。为了完成这个任务,在这里请回答 no
  7. 输入其他的用户。

    如果需要,重复刚才的过程你可以输入其他用户。你也可以在任何时候在运行系统里添加用户。不是选择默认的安全区,你需要添加用户到其他区以调整其授权过程。
  8. 非交互式地创建用户。

    通过在命令行传入参数,你可以非交互式地创建用户。我们不推荐在共享系统上使用这个方法,因为密码可以在日志或历史文件里看到。这个使用管理区域的命令的语法是:
    [user@host bin]$ ./add-user.sh username password
    要使用应用程序区域,请使用 -a 参数。
    [user@host bin]$ ./add-user.sh -a username password
  9. 通过 --silent 参数,你可以忽略 add-user 脚本的正常输出。这只有在指定了用户名密码且只使用了最小参数集时才适用。 而错误信息仍会被显示。
结果

你添加的任何用户都会在你指定的安全区里进行激活。ManagementRealm 区里活动的用户能够从远程系统里管理 JBoss EAP 6。

4.1.2. 传入参数到用户管理 add-user 脚本

您可以交互式地运行 add-user.shadd-user.bat 命令或将参数传入到命令行。本节描述了传入参数时可用的选项。
关于 add-user.shadd-user.bat 命令行的完整参数列表,请参考 第 4.1.3 节 “Add-user 命令行参数”
关于如何指定其他属性文件和位置,请参考 第 4.1.4 节 “指定用户管理信息的替代属性文件”
关于演示如何传递参数到 add-user.shadd-user.bat 命令行的示例,请参考 第 4.1.5 节 “Add-user 脚本命令行示例”

4.1.3. Add-user 命令行参数

下表描述了 add-user.shadd-user.bat 命令的可用参数。

表 4.1. Add-user 命令行参数

命令行参数 参数值 描述
-a
N/A
这个参数指定在应用程序区里创建用户。如果忽略,默认是在管理区里创建用户。
-dc
DOMAIN_CONFIGURATION_DIRECTORY
这个参数指定了包含属性文件的域配置目录。如果忽略,默认的目录是 EAP_HOME/domain/configuration/
-sc
SERVER_CONFIGURATION_DIRECTORY
这个参数指定了包含属性文件的其他独立服务器配置目录。如果忽略,默认的目录是 EAP_HOME/standalone/configuration/
-up
--user-properties
USER_PROPERTIES_FILE
这个参数指定其他用户属性文件的名称。它可以是一个绝对路径,也可以和 -sc-dc 参数一起来指定其他配置的目录。
-g
--group
GROUP_LIST
分配给这个用户的用逗号隔开的组的列表。
-gp
--group-properties
GROUP_PROPERTIES_FILE
这个参数指定其他组属性文件的名称。它可以是一个绝对路径,也可以和 -sc-dc 参数一起来指定其他配置的目录。
-p
--password
PASSWORD
用户的密码。密码必须满足下列要求:
  • 它必须包含至少 8 个字符。
  • 它必须包含至少一个字母字符。
  • 它必须包含至少一个数字。
  • 它必须包含至少一个非字母数字字符。
-u
--user
USER_NAME
用户的名称。它必须只包含字母数字字符。
-r
--realm
REALM_NAME
用来设置管理接口安全性的区的名称。如果忽略,默认是 ManagementRealm
-s
--silent
N/A
运行 add-user 脚本且不输出到控制台。
-h
--help
N/A
显示 add-user 脚本的用法。

4.1.4. 指定用户管理信息的替代属性文件

介绍

在默认情况下,用 add-user.shadd-user.bat 创建的用户和角色信息都保存在服务器配置目录下的属性文件里。服务器配置信息保存在 EAP_HOME/standalone/configuration/ 目录而域配置信息保存在 EAP_HOME/domain/configuration/ 目录。本节将描述如何覆盖默认的文件名称和位置。

过程 4.2. 指定替代属性文件

    • 要指定服务器配置的替代目录,请使用 -sc 参数。这个参数指定了包含服务器配置属性文件的替代目录。
    • 要为域配置指定替代目录,,请使用 -dc 参数。这个参数指定了包含域配置属性文件的替代目录。
    • 要指定替代的用户配置属性文件,请使用 -up--user-properties 参数。它可以是绝对路径,也可以和 -sc-dc 参数一起使用来指定替代的配置目录。
    • 要指定替代的组配置属性文件,请使用 -gp--group-properties 参数。它可以是绝对路径,也可以和 -sc-dc 参数一起使用来指定替代的配置目录。

注意

add-user 命令旨在操作现有的属性文件。命令行里指定任何替代属性文件都必须存在,否则您将看到下列错误:
JBAS015234: No appusers.properties files found
关于命令参数的更多信息,请参考 第 4.1.3 节 “Add-user 命令行参数”
关于 add-user 命令的示例,请参考 第 4.1.5 节 “Add-user 脚本命令行示例”

4.1.5. Add-user 脚本命令行示例

下面的例子演示了如何传递参数到 add-user.shadd-user.bat 命令。除非另有注明,这些命令假定是使用独立服务器配置的。

例 4.1. 创建属于使用默认属性文件的单个组的用户。

EAP_HOME/bin/add-user.sh -a -u 'appuser1' -p 'password1!' -g 'guest'
上面的命令产生下列结果。
  • 用户 appuser1 被添加到保存用户信息的下列默认属性文件里。
    EAP_HOME/standalone/configuration/application-users.properties
    EAP_HOME/domain/configuration/application-users.properties
  • 用户 appuser1 和组 guest 被添加到保存组信息的默认属性文件里。
    EAP_HOME/standalone/configuration/application-roles.properties
    EAP_HOME/domain/configuration/application-roles.properties

例 4.2. 创建属于使用默认属性文件的多个组的用户。

EAP_HOME/bin/add-user.sh -a -u 'appuser1' -p 'password1!' -g 'guest,app1group,app2group'
上面的命令产生下列结果。
  • 用户 appuser1 被添加到保存用户信息的下列默认属性文件里。
    EAP_HOME/standalone/configuration/application-users.properties
    EAP_HOME/domain/configuration/application-users.properties
  • 用户 appuser1 和组 guestapp1groupapp2group被添加到保存组信息的默认属性文件里。
    EAP_HOME/standalone/configuration/application-roles.properties
    EAP_HOME/domain/configuration/application-roles.properties

例 4.3. 在使用默认属性文件的默认区里创建带有管理权限的用户。

EAP_HOME/bin/add-user.sh -u 'adminuser1' -p 'password1!' -g 'admin'
上面的命令产生下列结果。
  • 用户 adminuser1 被添加到保存用户信息的下列默认属性文件里。
    EAP_HOME/standalone/configuration/mgmt-users.properties
    EAP_HOME/domain/configuration/mgmt-users.properties
  • 用户 adminuser1 和组 admin 被添加到保存组信息的默认属性文件里。
    EAP_HOME/standalone/configuration/mgmt-groups.properties
    EAP_HOME/domain/configuration/mgmt-groups.properties

例 4.4. 创建属于用替代属性文件保存信息的单个组的用户。

EAP_HOME/bin/add-user.sh -a -u appuser1 -p password1! -g app1group -sc /home/someusername/userconfigs/ -up appusers.properties -gp appgroups.properties 
上面的命令产生下列结果。
  • 我们添加了用户 appuser1 到下列属性文件里,它现在是保存用户信息的默认文件。
    /home/someusername/userconfigs/appusers.properties
  • 我们添加了用户 appuser1 和组 app1group 到下列属性文件里,它现在是保存组信息的默认文件。
    /home/someusername/userconfigs/appgroups.properties

第 5 章 网络和端口配置

5.1. 接口

5.1.1. 关于接口

应用服务器在整个配置里都使用命名接口引用。这让配置可以用逻辑名称引用单独的接口声明,而不是每次都使用整个接口细节。逻辑名称的使用也保持了组引用和命名接口的一致性,而受管域上的服务器实例可能包含多个主机上不同的接口细节。使用这个方法,每个服务器实例可能对应逻辑名称组,它可以将接口组作为整体进行管理。
网络接口是通过指定逻辑名和物理接口的选择标准来声明的。应用服务器附带有用于管理及公共接口名称的默认配置。在这个配置里,公共接口组的目的是用于和应用程序相关的网络通讯,如 Web 或 Messaging。管理接口组的目的是用于管理层要求的所有组件和服务,包括 HTTP 管理端点。接口名自身是仅作为建议来提供的,任何组的名称都可以按照需要进行替换和创建。
domain.xml, host.xmlstandalone.xml 都包含了接口声明。声明标准可以引用通配符地址或指定接口或地址必须具有来进行有效匹配的一个或多个特征。下面的例子展示了接口声明的多个可能的配置,它们通常是在 standalone.xmlhost.xml 配置文件里定义的。这允许任何远程主机组维护自己所专有的接口属性,且仍然允许对域控制器里的 domain.xml 配置文件里任何接口组的引用。
第一个例子展示了为 managementpublic 相对名称组指定的专有的 inet-address 值。

例 5.1. 用 inet-address 值创建的接口组

<interfaces>
  <interface name="management">
   <inet-address value="127.0.0.1"/>
  </interface>
  <interface name="public">
   <inet-address value="127.0.0.1"/>
  </interface>
</interfaces>


在下面的例子里,全局接口组使用了 any-address 元素来声明通配符地址。

例 5.2. 用通配符声明创建的全局组

<interface name="global">
   <!-- Use the wild-card address -->
   <any-address/>
</interface>


下面的例子声明了名为 external 的相对组下的一个网络接口卡。

例 5.3. 用 NIC 值创建的外部组

        
<interface name="external">
   <nic name="eth0"/>
</interface>


在下面的例子里,根据专有需求,声明作为默认组创建。在这个实例里,其他元素的特征为接口设置了条件以进行有效的匹配。这允许每个专有接口声明组的创建,且能够以当前模式引用它们,从而减少了跨多个服务器实例的配置和管理。

例 5.4. 用专有条件值创建的默认组

<interface name="default">
   <!-- Match any interface/address on the right subnet if it's
        up, supports multicast, and isn't point-to-point -->
   <subnet-match value="192.168.0.0/16"/>
   <up/>
   <multicast/>
   <not>
      <point-to-point/>
   </not>
</interface>


虽然接口声明可以在源配置文件里创建和编辑,管理 CLI 和管理控制台为配置的修改提供了安全的、可控和持久性的环境。

5.1.2. 配置接口

standalone.xmlhost.xml 配置文件里默认的接口配置通常提供三个带有相对接口令牌的命名接口。您可以使用管理控制台或管理 CLI 来配置下表列出的其他属性和值。你也可以按需要用专有值替换相对的接口绑定。请注意,如果您这样做,您将无法在运行时传入接口值,因为 -b 选项只能覆盖相对值。

例 5.5. 默认的接口配置

        
<interfaces>
  <interface name="management">
    <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
  </interface>
  <interface name="public">
    <inet-address value="${jboss.bind.address:127.0.0.1}"/>
  </interface>
  <interface name="unsecure">
    <inet-address value="${jboss.bind.address.unsecure:127.0.0.1}"/>
  </interface>
</interfaces>

表 5.1. 接口属性和值

接口元素 描述
any 地址排斥类型的空元素,用于约束选择标准。
any-address 空元素表示使用这个接口的套接字应该绑定到通配符地址。除非设置 java.net.preferIpV4Stack 系统属性为 true,否则 IPv6 将使用通配符地址(::),而 IPv4 将使用通配符地址(0.0.0.0)。如果套接字绑定到双栈主机上的任何本地 IPv6 地址,它可以接受 IPv6 及 IPv4 数据。如果绑定到任何的本地 IPv4 地址,它就只能接受 IPv4 数据。
any-ipv4-address 空元素表示使用这个接口的套接字应该绑定到 IPv4 通配符地址(0.0.0.0)。
any-ipv6-address 空元素表示使用这个接口的套接字应该绑定到 IPv6 通配符地址(::)。
inet-address 请输入 IPv6 格式的 IP 地址或者用小数点隔开的 IPv4 地址,或者可以解析为 IP 地址的主机名。
link-local-address 空元素表示接口的部分选择标准应该是或不是和 link-local 关联的地址。
loopback 空元素表示接口的部分选择标准应该是或不是 loopback 接口。
loopback-address 可能实际上不会在主机的 loopback 接口上配置的 loopback 地址。和 inet-addressType 不同的是,即使没有找到和 IP 地址相关的 NIC,给定的值也将被使用。
multicast 空元素表示接口的部分选择标准应该支持或不支持多点传送。
nic 网络接口的名称(如 eth0, eth1, lo) 。
nic-match 常规表达式,表示主机上可以映射可接受的接口的网络接口的名称。
not 地址排斥类型的空元素,用于约束选择标准。
point-to-point 空元素表示接口的部分选择标准是是否为 point-to-point 接口。
public-address 空元素表示接口的部分选择标准应该有或没有公共路由的地址。
site-local-address 空元素表示接口的部分选择标准应该是或不是和 site-local 关联的地址。
subnet-match 网络 IP 地址和地址的网络前缀的位数,以斜杠和数字表示;如 "192.168.0.0/16"。
up 空元素表示接口的部分选择标准应该是或不是正在运行。
virtual 空元素表示接口的部分选择标准应该是或不是虚拟接口。
  • 配置接口属性

    您可以用 Tab Completion 来完成输入的命令,并开放可用的属性。
    • 用管理 CLI 配置接口属性

      使用管理 CLI 来添加新的接口并编写新的接口属性的值。
      1. 添加新的接口

        使用 add 操作来创建新的接口。您可以在管理 CLI 会话的根目录里运行 add 命令,下面的例子创建了一个名为 interfacename 的接口,它将 inet-address 声明为 12.0.0.2
        /interface=interfacename/:add(inet-address=12.0.0.2)
      2. 编辑接口属性

        write 操作将新的值写入属性。下面的例子将 inet-address 的值更新为 12.0.0.8
        /interface=interfacename/:write-attribute(name=inet-address, value=12.0.0.8)
      3. 检验接口属性

        通过 include-runtime=true 参数运行 read-resource 操作来确认值已修改,从而开放服务器模型里所有当前的值。例如:
        [standalone@localhost:9999 interface=public] :read-resource(include-runtime=true)
    • 用管理控制台配置接口属性

      1. 登录到管理控制台。

        登录到受管域或独立服务器实例的管理控制台。
      2. 进入 Interfaces 屏幕

        1. 进入 Configuration 标签页。

          从屏幕顶部选择 Configuration 标签页。
        2. 仅用于域模式

          从屏幕左上角的 Profile 下拉菜单里选择要修改的配置集。
      3. 从导航菜单里选择 Interfaces

        展开 General Configuration 菜单。从导航菜单里选择 Interfaces 菜单条目。
      4. 添加新的接口

        1. 添加
        2. 输入 NameInet AddressAddress Wildcard 的值。
        3. 点击 Save
      5. 编辑接口属性

        1. Available Interfaces 列表里选择要编辑的接口并点击 Edit
        2. 输入 NameInet AddressAddress Wildcard 的值。
        3. 点击 Save

5.2. 套接字绑定组

5.2.1. 关于套接字绑定组

套接字绑定和绑定组允许您定义网络接口及它们和 JBoss EAP 6 配置要求的网络接口的关系。
套接字绑定是用于套接字的命名配置。这些命名配置的声明可以在 domain.xmlstandalone.xml 配置文件里找到。配置的其他部分可以通过逻辑名引用这些套接字,而无需包含套接字配置的完整细节。这允许您引用不同主机上可能不同的相对套接字配置。
套接字绑定是通过套接字组来收集的。套接字绑定组是按照逻辑名称分组的套接字绑定声明的集合。然后这个命名组可以在整个配置里进行引用。独立服务器配置只包含一个这样的组,而受管域实例则可以包含多个组。您可以在受管域里为每个服务器组创建一个套接字绑定组,或者在多个服务器组间分享套接字绑定组。
在配置受管域的服务器组时,命名组允许对特定的套接字绑定组使用简化的引用。另外一个通常的用途是对同一个系统上的多个独立服务器实例的配置和管理。下面的例子分别展示了独立和域实例的配置文件里的默认套接字绑定组。

例 5.6. 独立配置的默认套接字绑定

standalone.xml 配置文件里的默认套接字绑定组是按照 standard-sockets 分组的。public 接口也通过相同的逻辑引用方法引用了这个组。
   
<socket-binding-group name="standard-sockets" default-interface="public">
    <socket-binding name="http" port="8080"/>
    <socket-binding name="https" port="8443"/>
    <socket-binding name="jacorb" port="3528"/>
    <socket-binding name="jacorb-ssl" port="3529"/>
    <socket-binding name="jmx-connector-registry" port="1090" interface="management"/>
    <socket-binding name="jmx-connector-server" port="1091" interface="management"/>
    <socket-binding name="jndi" port="1099"/>
    <socket-binding name="messaging" port="5445"/>
    <socket-binding name="messaging-throughput" port="5455"/>
    <socket-binding name="osgi-http" port="8090" interface="management"/>
    <socket-binding name="remoting" port="4447"/>
    <socket-binding name="txn-recovery-environment" port="4712"/>
    <socket-binding name="txn-status-manager" port="4713"/>
</socket-binding-group>

例 5.7. 域配置的默认套接字绑定

domain.xml 配置文件里的默认套接字绑定组包含了四个组:standard-socketsha-socketsfull-socketsfull-ha-sockets。这些组也被名为 public 的接口所引用。
<socket-binding-groups>
    <socket-binding-group name="standard-sockets" default-interface="public">
        <!-- Needed for server groups using the 'default' profile  -->
        <socket-binding name="ajp" port="8009"/>
        <socket-binding name="http" port="8080"/>
        <socket-binding name="https" port="8443"/>
        <socket-binding name="osgi-http" interface="management" port="8090"/>
        <socket-binding name="remoting" port="4447"/>
        <socket-binding name="txn-recovery-environment" port="4712"/>
        <socket-binding name="txn-status-manager" port="4713"/>
        <outbound-socket-binding name="mail-smtp">
            <remote-destination host="localhost" port="25"/>
        </outbound-socket-binding>
    </socket-binding-group>
    <socket-binding-group name="ha-sockets" default-interface="public">
        <!-- Needed for server groups using the 'ha' profile  -->
        <socket-binding name="ajp" port="8009"/>
        <socket-binding name="http" port="8080"/>
        <socket-binding name="https" port="8443"/>
        <socket-binding name="jgroups-mping" port="0" multicast-address="${jboss.default.multicast.address:230.0.0.4}" multicast-port="45700"/>
        <socket-binding name="jgroups-tcp" port="7600"/>
        <socket-binding name="jgroups-tcp-fd" port="57600"/>
        <socket-binding name="jgroups-udp" port="55200" multicast-address="${jboss.default.multicast.address:230.0.0.4}" multicast-port="45688"/>
        <socket-binding name="jgroups-udp-fd" port="54200"/>
        <socket-binding name="modcluster" port="0" multicast-address="224.0.1.105" multicast-port="23364"/>
        <socket-binding name="osgi-http" interface="management" port="8090"/>
        <socket-binding name="remoting" port="4447"/>
        <socket-binding name="txn-recovery-environment" port="4712"/>
        <socket-binding name="txn-status-manager" port="4713"/>
        <outbound-socket-binding name="mail-smtp">
            <remote-destination host="localhost" port="25"/>
        </outbound-socket-binding>
    </socket-binding-group>
    <socket-binding-group name="full-sockets" default-interface="public">
        <!-- Needed for server groups using the 'full' profile  -->
        <socket-binding name="ajp" port="8009"/>
        <socket-binding name="http" port="8080"/>
        <socket-binding name="https" port="8443"/>
        <socket-binding name="jacorb" interface="unsecure" port="3528"/>
        <socket-binding name="jacorb-ssl" interface="unsecure" port="3529"/>
        <socket-binding name="messaging" port="5445"/>
        <socket-binding name="messaging-group" port="0" multicast-address="${jboss.messaging.group.address:231.7.7.7}" multicast-port="${jboss.messaging.group.port:9876}"/>
        <socket-binding name="messaging-throughput" port="5455"/>
        <socket-binding name="osgi-http" interface="management" port="8090"/>
        <socket-binding name="remoting" port="4447"/>
        <socket-binding name="txn-recovery-environment" port="4712"/>
        <socket-binding name="txn-status-manager" port="4713"/>
        <outbound-socket-binding name="mail-smtp">
            <remote-destination host="localhost" port="25"/>
        </outbound-socket-binding>
    </socket-binding-group>
    <socket-binding-group name="full-ha-sockets" default-interface="public">
        <!-- Needed for server groups using the 'full-ha' profile  -->
        <socket-binding name="ajp" port="8009"/>
        <socket-binding name="http" port="8080"/>
        <socket-binding name="https" port="8443"/>
        <socket-binding name="jacorb" interface="unsecure" port="3528"/>
        <socket-binding name="jacorb-ssl" interface="unsecure" port="3529"/>
        <socket-binding name="jgroups-mping" port="0" multicast-address="${jboss.default.multicast.address:230.0.0.4}" multicast-port="45700"/>
        <socket-binding name="jgroups-tcp" port="7600"/>
        <socket-binding name="jgroups-tcp-fd" port="57600"/>
        <socket-binding name="jgroups-udp" port="55200" multicast-address="${jboss.default.multicast.address:230.0.0.4}" multicast-port="45688"/>
        <socket-binding name="jgroups-udp-fd" port="54200"/>
        <socket-binding name="messaging" port="5445"/>
        <socket-binding name="messaging-group" port="0" multicast-address="${jboss.messaging.group.address:231.7.7.7}" multicast-port="${jboss.messaging.group.port:9876}"/>
        <socket-binding name="messaging-throughput" port="5455"/>
        <socket-binding name="modcluster" port="0" multicast-address="224.0.1.105" multicast-port="23364"/>
        <socket-binding name="osgi-http" interface="management" port="8090"/>
        <socket-binding name="remoting" port="4447"/>
        <socket-binding name="txn-recovery-environment" port="4712"/>
        <socket-binding name="txn-status-manager" port="4713"/>
        <outbound-socket-binding name="mail-smtp">
            <remote-destination host="localhost" port="25"/>
        </outbound-socket-binding>
    </socket-binding-group>
</socket-binding-groups>

套接字绑定实例可以在应用服务器目录下的 standalone.xmldomain.xml 文件里创建和编辑。我们推荐的管理绑定的方法是使用管理控制台或管理 CLI。使用管理控制台的优势包括图形化的用户界面,在 General Configuration 部分里有专门的 Socket Binding Group 屏幕。管理 CLI 提供 API 和基于命令行的批处理工作流程,并可以对应用服务器配置的更高和更低级别使用脚本。两种界面都可以持久化修改或者保存修改到服务器配置文件里。

5.2.2. 配置套接字绑定

套接字绑定可以在唯一的套接字绑定组里定义。独立服务器包含一个 standard-sockets 组,且无法创建更多的组。相反,您可以创建替代的独立服务器配置文件。对于受管域,您可以创建多个套接字绑定组并按需要配置它们包含的套接字绑定。下表展示了每个套接字绑定的可用属性。

表 5.2. 套接字绑定属性

属性 描述 角色
name 应该用在配置里其他位置的套接字配置的逻辑名。 必需
port 基于这个配置的套接字应该绑定的基础端口。请注意,您可以通过应用于所有端口的增量或减量来配置服务器以覆盖这个基础值。 必需
interface 基于这个配置的套接字应该绑定的接口的逻辑名。如果没有定义,将会使用附带的套接字绑定组里 default-interface 属性的值。 可选
multicast-address 如果套接字用于多点传送,要使用的多点传送地址。 可选
multicast-port 如果套接字用于多点传送,要使用的多点传送端口。 可选
fixed-port 如果为 true,表示 true 的值必须总是用于套接字且不应该通过增减值来进行覆盖。 可选
  • 配置套接字绑定组里的套接字绑定

    请选择管理 CLI 或管理控制台来按需要配置套接字绑定。
    • 使用管理 CLI 配置套接字绑定

      使用管理 CLI 配置套接字绑定。
      1. 添加新的套接字绑定

        如果有需要,请使用 add 操作来创建新的地址设置。您可以在管理 CLI 会话的根目录里运行这个命令,下面的例子创建了一个名为 newsocket 的套接字绑定,它的 port 属性声明为 1234。这些例子适用于独立服务器和受管域的 standard-sockets 套接字绑定组。
        [domain@localhost:9999 /] /socket-binding-group=standard-sockets/socket-binding=newsocket/:add(port=1234)
      2. 编辑 Pattern 属性

        使用 write-attribute 操作来编写新的属性的值。您可以使用 tab completion 来帮助输入并提示所有可用的值。下面的例子将 port 的值更新为 2020
        [domain@localhost:9999 /] /socket-binding-group=standard-sockets/socket-binding=newsocket/:write-attribute(name=port,value=2020)
      3. 确认 Pattern 属性

        通过 include-runtime=true 参数运行 read-resource 操作来确认值已修改以开放服务器模型里所有当前的值。
        [domain@localhost:9999 /] /socket-binding-group=standard-sockets/socket-binding=newsocket/:read-resource
    • 使用管理控制台配置套接字绑定

      使用管理控制台配置套接字绑定。
      1. 登录到管理控制台。

        登录到受管域或独立服务器的管理控制台。
      2. 进入 Configuration 标签页。

        从屏幕顶部选择 Configuration 标签页。
      3. 从导航菜单里选择 Socket Binding 菜单条目。

        展开 General Configuration 菜单。选择 Socket Binding。如果您在使用受管域,请在 Socket Binding Groups 列表里选择所需的组。
      4. 添加新的套接字绑定

        1. 点击 Add 按钮。
        2. 输入 Name, PortBinding Group 的值。
        3. 点击Save完成。
      5. 编辑套接字绑定

        1. 从列表里选择要编辑的套接字绑定并点击 Edit 按钮。
        2. 输入 Name, InterfacePort 的值。
        3. 点击Save完成。

5.2.3. JBoss EAP 6 使用的网络端口

JBoss EAP 6 的默认配置使用的端口取决于下列因素:
  • 你的服务器组是否使用了默认的套接字绑定组,或者自定义的套接字绑定组。
  • 单独部署的要求。

注意

你可以配置一个数字的端口偏移量,以减缓当在同一个服务服务器上运行多个服务器时端口冲突。如果你的服务器使用了数字的端口偏移量,在它的服务器组的套接字绑定组的默认端口上添加偏移量。例如,如果套接字绑定组的 HTTP 端口是 8080,而你的服务器使用了端口偏移量为 100,那么它的 HTTP 端口是 8180
除非额外指定,这个端口将使用 TCP 协议。

默认的套接字绑定组

  • full-ha-sockets
  • full-sockets
  • ha-sockets
  • standard-sockets

表 5.3. 默认的套接字绑定组的引用

名称 端口 多点传送端口 描述 full-ha-sockets full-sockets ha-socket standard-socket
ajp 8009 Apache JServ 协议,用于 HTTP 群集和负载平衡。 支持 支持 支持 支持
http 8080 用于已部署应用程序的默认端口。 支持 支持 支持 支持
https 8443 已部署的应用程序和客户间的用 SSL 加密的连接。 支持 支持 支持 支持
jacorb 3528 用于 JTS 事务的 CORBA 服务和其他依赖于 ORB 的服务。 支持 支持 不支持 不支持
jacorb-ssl 3529 SSL 加密的 CORBA 服务。 支持 支持 不支持 不支持
jgroups-diagnostics 7500 多点传送。用于 HA 群集里的 Peer 发现。不能使用管理界面进行配置。 支持 不支持 支持 不支持
jgroups-mping 45700 多点传送。用于在 HA 群集里发现初始成员资格。 支持 不支持 支持 不支持
jgroups-tcp 7600 HA 群集里使用 TCP 的多点传送 Peer 发现。 支持 不支持 支持 不支持
jgroups-tcp-fd 57600 用于 TCP 上的 HA 失败检测。 支持 不支持 支持 不支持
jgroups-udp 55200 45688 HA 群集里使用 UDP 的多点传送 Peer 发现。 支持 不支持 支持 不支持
jgroups-udp-fd 54200 用于 UDP 上的 HA 失败检测。 支持 不支持 支持 不支持
messaging 5445 JMS 服务。 支持 支持 不支持 不支持
messaging-group 被 HornetQ JMS 广播和发现组引用。 支持 支持 不支持 不支持
messaging-throughput 5455 JMS remoting 所使用的。 支持 支持 不支持 不支持
mod_cluster 23364 用于 JBoss EAP 6 和 HTTP 加载平衡器之间通讯的多点传送端口。 支持 不支持 支持 不支持
osgi-http 8090 由使用 OSGi 子系统的内部组件使用。不能通过管理界面进行配置。 支持 支持 支持 支持
remoting 4447 用于远程 EJB 调用。 支持 支持 支持 支持
txn-recovery-environment 4712 JTA 事务恢复管理者。 支持 支持 支持 支持
txn-status-manager 4713 JTA / JTS 事务管理者。 支持 支持 支持 支持
管理端口

除了套接字绑定组,每个主机控制台都打开另外两个端口用于管理:

  • 9990 - Web 管理控制台的端口
  • 9999 - 管理控制台和 API 使用的端口
此外,如果管理控制台启用了 HTTPS,那么 9443 将作为默认端口打开。

5.2.4. 关于套接字绑定组的端口偏移

端口偏移是添加到服务器的套接字组给定的端口值的数字偏移量。这允许单个服务器继承服务器组的套接字绑定,并用偏移量来确保它和组里的其他服务器不冲突。例如,如果套接字绑定组的 HTTP 端口是 8080,而你的服务器使用了端口偏移量为 100,那么它的 HTTP 端口是 8180。

5.2.5. 配置端口偏移

  • 配置端口偏移

    选择管理 CLI 或管理控制台来配置您的端口偏移。
    • 使用管理 CLI 配置端口偏移

      使用管理 CLI 来配置端口偏移。
      1. 编辑端口偏移

        使用 write-attribute 操作来为端口偏移属性编写新的值。下面的例子更新了 server-twosocket-binding-port-offset 值为 250。这个服务器是默认本地主机组的成员。为使改动生效,服务器需要重启。
        [domain@localhost:9999 /] /host=master/server-config=server-two/:write-attribute(name=socket-binding-port-offset,value=250)
      2. 确认端口偏移属性

        通过 include-runtime=true 参数运行 read-resource 操作来确认值已修改以开放服务器模型里所有当前的值。
        [domain@localhost:9999 /] /host=master/server-config=server-two/:read-resource(include-runtime=true)
    • 使用管理控制台来配置端口偏移

      使用管理控制台来配置端口偏移。
      1. 登录到管理控制台。

        登录到您的受管域的管理控制台。
      2. 选择 Domain 标签页

        从屏幕顶部选择 Domain 标签页。
      3. 编辑端口偏移属性

        1. Available Server Configurations 列表里选择服务器并点击属性列表顶部的 Edit 按钮。
        2. Port Offset 字段里输入想要的值。
        3. 点击Save完成。

5.2.6. 配置 Remoting 里的消息大小

Remoting 子系统提供了限制用于远程协议的消息的大小的选项。您可以设置最大的转入消息(MAX_INBOUND_MESSAGE_SIZE)及最大的转出消息(MAX_OUTBOUND_MESSAGE_SIZE)来确保接收和发送的消息具有合适的大小。
配置远程协议里的消息大小有助于有效地利用系统内存并防止在执行重要任务时内存溢出。
如果发送者发送的消息超过了最大限制(MAX_INBOUND_MESSAGE_SIZE),服务器将抛出异常并取消数据的传输。然而连接将保持打开且如果需要的话发送者可以选择关闭消息。
如果接收的消息超过了最大限制(MAX_INBOUND_MESSAGE_SIZE),消息将被异步关闭而连接仍将保持打开。

5.3. IPv6

5.3.1. 配置 IPv6 网络的 JVM Stack 首选项

概述
本节涵盖为 JBoss EAP 6 安装启用 IPv6 网络。

过程 5.1. 禁用 IPv4 Stack Java 属性

  1. 打开相关的安装文件:
    • 对于独立服务器:

      打开 EAP_HOME/bin/standalone.conf
    • 对于受管域:

      打开 EAP_HOME/bin/domain.conf
  2. 修改 IPv4 Stack Java 属性为 false:
    -Djava.net.preferIPv4Stack=false
    例如:
    # Specify options to pass to the Java VM.
    #
    if [ "x$JAVA_OPTS" = "x" ]; then
       JAVA_OPTS="-Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=false 
       -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 
       -Dsun.rmi.dgc.server.gcInterval=3600000 -Djava.net.preferIPv6Addresses=true"
    fi
    

5.3.2. 配置 IPv6 网络的接口声明

概述

遵循下列步骤来配置 IPv6 的接口 inet 地址:

过程 5.2. 配置 IPv6 网络的接口

  1. 从屏幕顶部选择 Configuration 标签页。
  2. 展开 General Configuration 菜单并选择 Interfaces
  3. Available Interfaces 列表里选择接口。
  4. 点击细节列表里的 Edit 按钮。
  5. 设置 inet 地址为:
    ${jboss.bind.address.management:[ADDRESS]}
  6. 点击Save完成。
  7. 重启服务器来应用这些修改。

5.3.3. 配置 IPv6 地址的 JVM Stack 首选项

概述
本节涵盖通过配置文件配置 JBoss EAP 6 安装首选 IPv6 地址。

过程 5.3. 配置 JBoss EAP 6 安装首选 IPv6 地址

  1. 打开相关的安装文件:
    • 对于独立服务器:

      打开 EAP_HOME/bin/standalone.conf
    • 对于受管域:

      打开 EAP_HOME/bin/domain.conf
  2. 附加下列 Java 属性到 Java VM 选项:
    -Djava.net.preferIPv6Addresses=true
    例如:
    # Specify options to pass to the Java VM.
    #
    if [ "x$JAVA_OPTS" = "x" ]; then
       JAVA_OPTS="-Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=false 
       -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 
       -Dsun.rmi.dgc.server.gcInterval=3600000 -Djava.net.preferIPv6Addresses=true"
    fi
    

第 6 章 数据源管理

6.1. 介绍

6.1.1. 关于 JDBC

JDBC API 是定义 Java 应用程序如何访问数据库的标准。应用程序配置引用 JDBC 驱动的数据源。然后可以再次针对驱动而不是数据库编写应用程序代码。驱动将代码转换为数据库语言。这表示如果安装了正确的驱动,应用程序就可以使用受支持的数据库了。
JDBC 4.0 规格是在这里定义的:http://jcp.org/en/jsr/detail?id=221
要开始使用 JDBC 和数据源,请参考 JBoss EAP 6 的《管理和配置指南》里的《JDBC 驱动》章节。

6.1.2. JBoss EAP 6 支持的数据库

关于 JBoss EAP 6 支持的兼容 JDBC 的数据库列表,请参考:https://access.redhat.com/site/articles/111663

6.1.3. 数据源的类型

两种常用的资源类型是非 XA 数据源XA 数据源
非 XA 数据源用于不使用事务的应用程序,或者以单个数据库使用事务的应用程序。
XA 数据源用于事务分布在多个数据库的应用程序。XA 数据源会导致额外的负荷。
当你在管理控制台或管理 CLI 里创建数据源时,你可以指定它的类型。

6.1.4. 数据源示例

JBoss EAP 6 里包含了一个 H2 数据源,它是一个轻量级的关系型数据库管理系统,它为开发者提供了快速构建应用程序的能力,而且是平台的示例数据源。

警告

然而,JBoss EAP 附带的示例数据源不应该用于产品环境。它是一个非常小、自包容的数据源,它支持所有测试和构建应用程序所需的标准,但它并不健壮也不具有足够的可扩充性以用于产品环境。
关于被支持和认证的数据源,请参考 第 6.1.2 节 “JBoss EAP 6 支持的数据库”

6.1.5. -ds.xml 文件的部署

在 JBoss EAP 6 里,数据源被定义为服务器子系统的资源。在以前的版本里,服务器配置的 deploy 目录里要求有 *-ds.xml 数据源配置文件。*-ds.xml 文件仍可以按照Schemas 这里http://www.ironjacamar.org/documentation.html 的 1.1 数据源模式部署在 JBoss EAP 6 里。

警告

这个功能应该只用于部署。我们不推荐将其用于产品环境,因为 JBoss 管理工具并不支持它。

重要

当部署 *-ds.xml 文件时,使用对已部署 / 定义的<driver> 条目的引用是强制的。

6.2. JDBC 驱动

6.2.1. 用管理控制台安装 JDBC 驱动

介绍

在你的应用程序可以连接 JDBC 数据源之前,你的数据源供应商的 JDBC 驱动需要安装在 JBoss EAP 可以使用的位置上。JBoss EAP 6 允许你象其他部署一样部署这些驱动。这意味着如果你使用了受管域,你可以将它们部署在服务器组里的多个服务器上。

预备条件

在执行这个任务之前,你需要满足以下预备条件:

  • 从数据库供应商下载 JDBC 驱动。

注意

任何兼容 JDBC 4 的驱动都自动会被承认且根据名称和版本安装至系统里。JDBC JAR 通过 Java 服务供应商机制来识别。这样的 JAR 里有 META-INF/services/java.sql.Driver 文本,它包含该 JAR 里驱动类的名称。

过程 6.1. 修改 JDBC 驱动 JAR

如果 JDBC 驱动 JAR 不兼容 JDBC 4,您可用下列方法使其成为可部署的。
  1. 修改或创建空的临时目录。
  2. 创建一个 META-INF 子目录。
  3. 创建一个 META-INF/services 子目录。
  4. 创建一个 META-INF/services/java.sql.Driver 文件,它包含一行指明 JDBC 驱动的全限定类名的内容。
  5. 使用 JAR 命令行工具来更新 JAR:
    jar \-uf jdbc-driver.jar META-INF/services/java.sql.Driver

过程 6.2. 部署 JDBC 驱动

  1. 访问管理控制台。

  2. 将 JAR 文件部署到服务器或服务器组。

    如果你使用了受管域,你可以将 JAR 文件部署到服务器组。否则,部署到自己的服务器。请参考 第 10.2.2 节 “用管理控制台启用已部署的应用程序”
结果:

JDBC 驱动被部署,可由你的应用程序所使用。

6.2.2. 将 JDBC 驱动安装为核心模块

预备条件

在执行这个任务之前,你需要满足以下预备条件:

过程 6.3. 将 JDBC 驱动安装为核心模块

  1. EAP_HOME/modules/ 目录下创建一个文件路径结构。例如,对于 MySQL JDBC 驱动,创建下列目录结构:EAP_HOME/modules/com/mysql/main/
  2. 将 JDBC 驱动的 JAR 文件复制到 main/ 子目录。
  3. main/ 子目录里,创建一个类似于下列示例的 module.xml 文件: 第 7.1.1 节 “模块”module XSD 在 EAP_HOME/docs/schema/module-1_2.xsd 文件里进行定义。
  4. 启动服务器。
  5. 启动管理 CLI。
  6. 运行 CLI 命令将 JDBC 驱动模块添加到服务器配置里。
    你选择的命令取决于 JDBC 驱动 JAR 里的 /META-INF/services/java.sql.Driver 文件里列出的类的数量。例如,MySQL 5.1.20 JDBC JAR 里的 /META-INF/services/java.sql.Driver 文件列出了两个类:
    • com.mysql.jdbc.Driver
    • com.mysql.fabric.jdbc.FabricMySQLDriver
    当有多个条目时,您必须也指定驱动类的名称。没这样做会导致这样的错误:
    JBAS014749: Operation handler failed: Service jboss.jdbc-driver.mysql is already registered
    • 为包含一个驱动类条目的 JDBC JAR 运行 CLI 命令。
      /subsystem=datasources/jdbc-driver=DRIVER_NAME:add(driver-name=DRIVER_NAME,driver-module-name=MODULE_NAME,driver-xa-datasource-class-name=XA_DATASOURCE_CLASS_NAME)

      例 6.1. 用于具有一个驱动类的 JDBC JAR 的独立模式的 CLI 命令示例

      /subsystem=datasources/jdbc-driver=mysql:add(driver-name=mysql,driver-module-name=com.mysql,driver-xa-datasource-class-name=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource)

      例 6.2. 用于具有一个驱动类的 JDBC JAR 的域模式的 CLI 命令示例

      /profile=ha/subsystem=datasources/jdbc-driver=mysql:add(driver-name=mysql,driver-module-name=com.mysql,driver-xa-datasource-class-name=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource)
    • 为具有多个驱动类条目的 JDBC JAR 运行 CLI 命令。
      /subsystem=datasources/jdbc-driver=DRIVER_NAME:add(driver-name=DRIVER_NAME,driver-module-name=MODULE_NAME,driver-xa-datasource-class-name=XA_DATASOURCE_CLASS_NAME, driver-class-name=DRIVER_CLASS_NAME)

      例 6.3. 用于具有多个驱动类条目的 JDBC JAR 的独立模式的 CLI 命令示例

      /subsystem=datasources/jdbc-driver=mysql:add(driver-name=mysql,driver-module-name=com.mysql,driver-xa-datasource-class-name=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource, driver-class-name=com.mysql.jdbc.Driver)

      例 6.4. 用于具有多个驱动类条目的 JDBC JAR 的域模式的 CLI 命令示例

      /profile=ha/subsystem=datasources/jdbc-driver=mysql:add(driver-name=mysql,driver-module-name=com.mysql,driver-xa-datasource-class-name=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource, driver-class-name=com.mysql.jdbc.Driver)
结果

已安装好 JDBC 驱动并设置为核心模块,且可以被应用程序数据源引用。

6.2.3. JDBC 驱动的下载位置

下表列出了 JBoss EAP 6 常用的数据库的 JDBC 驱动的下载位置。这些链接指向不受 Red Hat 监控或控制的第三方网站。关于您的数据库的最新驱动,请参考相关数据库供应商的文档和网站。

6.2.4. 访问供应商专有的类

介绍

本节涵盖使用 JDBC 专有类所需的步骤。当应用程序需要使用非 JDBC API 一部分的供应商专有功能时这是有必要的。

警告

这是高级的应用。只有需要 JDBC API 里找不到的功能时才应该实现这个过程。

重要

在使用重验证机制并访问供应商专有的类时这个过程是必需的。

重要

因为这个连接是被 Iron Jacamar 容器控制的,请严格遵循供应商专有的 API 准则。

过程 6.4. 在应用程序里添加依赖关系

    • 配置 MANIFEST.MF 文件

      1. 在文本编辑器里打开应用程序的 META-INF/MANIFEST.MF 文件。
      2. 为 JDBC 模块添加一个依赖关系并保存文件。
        依赖关系:MODULE_NAME

        例 6.5. 依赖关系示例

        依赖关系:com.mysql
      1. 创建一个 jboss-deployment-structure.xml 文件

        在应用程序的 META-INF/ or WEB-INF 文件夹里创建一个名为 jboss-deployment-structure.xml 的文件。

        例 6.6. jboss-deployment-structure.xml 文件示例

        <jboss-deployment-structure>
          <deployment>
            <dependencies>
              <module name="com.mysql" />
            </dependencies>
          </deployment>
        </jboss-deployment-structure>
        
        

例 6.7. 访问供应商专有的 API

下面的例子访问了 MySQL API。
import java.sql.Connection;
import org.jboss.jca.adapters.jdbc.WrappedConnection;

  Connection c = ds.getConnection();
  WrappedConnection wc = (WrappedConnection)c;
  com.mysql.jdbc.Connection mc = wc.getUnderlyingConnection();

6.3. Non-XA 数据源

6.3.1. 用管理界面创建一个 Non-XA 数据源

概述

本节涵盖用管理控制台或管理 CLI 创建 Non-XA 数据源所需的步骤。

前提条件

  • JBoss EAP 6 服务器必须正在运行。

注意

在 Oracle 数据源 10.2 之前的版本里,<no-tx-separate-pools/> 参数是必需的,因为非事务性和事务性连接的混合可能导致错误。对于某些应用程序来说,这个参数已不再是必需的了。

过程 6.5. 用管理 CLI 或管理控制台创建一个数据源

    • 管理 CLI

      1. 启动 CLI 工具并连接到您的服务器。
      2. 运行下列命令来创建 Non-XA 数据源,配置合适的变量:
        data-source add --name=DATASOURCE_NAME --jndi-name=JNDI_NAME --driver-name=DRIVER_NAME  --connection-url=CONNECTION_URL
      3. 启用数据源:
        data-source enable --name=DATASOURCE_NAME
    • 管理控制台

      1. 登陆到管理控制台。
      2. 进入管理控制台的 Datasources 面板

        1. 从控制台顶部选择 Configuration 标签页。
        2. 对于域模式,从左上角的下拉菜单里选择合适的配置集。
        3. 展开控制台左侧的 Subsystems 菜单,然后展开 Connector 菜单。
        4. 从控制台左侧的菜单里选择 Datasources
      3. 创建新的数据源

        1. 点击 Datasources 面板顶部的 Add 按钮。
        2. Create Datasource 向导里输入新的数据源属性并点击 Next 按钮。
        3. Create Datasource 向导里输入 JDBC 驱动细节并点击 Next 按钮。
        4. Create Datasource 向导里输入连接设置。
        5. 点击 Test Connection 按钮测试到数据源的连接并检验设置是否正确。
        6. 点击 Done 完成。
结果

Non-XA 数据源已被添加至服务器。它在 standalone.xmldomain.xml 文件以及管理界面里都可见。

6.3.2. 用管理界面修改 Non-XA 数据源

概述

本节涵盖用管理控制台或管理 CLI 修改 Non-XA 数据源所需的步骤。

注意

Non-XA 数据源可以和 JTA 事务继承。要继承数据源和 JTA,请确保 jta 参数被设置为 true

过程 6.6. 修改 Non-XA 数据源

    • 管理 CLI

      1. 使用 write-attribute 命令来配置数据源属性:
        /subsystem=datasources/data-source=DATASOURCE_NAME:write-attribute(name=ATTRIBUTE_NAME,value=ATTRIBUTE_VALUE)
      2. 重载服务器来确认修改:
        :reload
    • 管理控制台

      1. 进入管理控制台的 Datasources 面板

        1. 从控制台顶部选择 Configuration 标签页。
        2. 对于域模式,从左上角的下拉菜单里选择合适的配置集。
        3. 展开控制台左侧的 Subsystems 菜单,然后展开 Connector 菜单。
        4. 从展开的菜单选择 Datasources
      2. 编辑数据源

        1. Available Datasources 列表里选择相关的数据源。下面显示了数据源属性。
        2. 点击 Edit 按钮来编辑数据源属性。
        3. 点击Save完成。
结果

已完成对 Non-XA 数据源的配置。这些修改在 standalone.xmldomain.xml 文件以及管理界面里都可见。

6.3.3. 用管理界面删除 Non-XA 数据源

概述

本节涵盖用管理控制台或管理 CLI 从 JBoss EAP 6 删除 Non-XA 数据源所需的步骤。

过程 6.7. 删除 Non-XA 数据源

    • 管理 CLI

      1. 运行下列命令来删除 Non-XA 数据源:
        data-source remove --name=DATASOURCE_NAME
    • 管理控制台

      1. 进入管理控制台的 Datasources 面板

        1. 从控制台顶部选择 Configuration 标签页。
        2. 对于域模式,从左上角的下拉菜单里选择合适的配置集。
        3. 展开控制台左侧的 Subsystems 菜单,然后展开 Connector 菜单。
        4. 选择 Datasources
      2. 选择要删除的数据源,然后点击 Remove
结果

非 XA 数据源已从服务器删除。

6.4. XA 数据源

6.4.1. 用管理界面创建 XA 数据源

介绍

本节涵盖用管理控制台或管理 CLI 创建 XA 数据源所需的步骤。

注意

在 Oracle 数据源 10.2 之前的版本里,<no-tx-separate-pools/> 参数是必需的,因为非事务性和事务性连接的混合可能导致错误。对于某些应用程序来说,这个参数已不再是必需的了。

过程 6.8. 用管理 CLI 或管理控制台创建 XA 数据源

    • 管理 CLI

      1. 运行下列命令来创建 XA 数据源,配置合适的变量:
        xa-data-source add --name=XA_DATASOURCE_NAME --jndi-name=JNDI_NAME --driver-name=DRIVER_NAME --xa-datasource-class=XA_DATASOURCE_CLASS
      2. 配置 XA 数据源属性

        1. 设置服务器名称

          运行下列命令来配置主机的服务器名称:
          /subsystem=datasources/xa-data-source=XA_DATASOURCE_NAME/xa-datasource-properties=ServerName:add(value=HOSTNAME)
        2. 设置数据库名称

          运行下列命令来配置数据库名称:
          /subsystem=datasources/xa-data-source=XA_DATASOURCE_NAME/xa-datasource-properties=DatabaseName:add(value=DATABASE_NAME)
      3. 启用数据源:
        xa-data-source enable --name=XA_DATASOURCE_NAME
    • 管理控制台

      1. 进入管理控制台的 Datasources 面板

        1. 从控制台顶部选择 Configuration 标签页。
        2. 对于域模式,从左上角的下拉菜单里选择合适的配置集。
        3. 展开控制台左侧的 Subsystems 菜单,然后展开 Connector 菜单。
        4. 选择 Datasources
      2. 选择 XA Datasource 标签页。
      3. 创建新的 XA 数据源

        1. 添加
        2. Create XA Datasource 向导里输入新的 XA 数据源属性并点击 Next 按钮。
        3. Create XA Datasource 向导里输入 JDBC 驱动细节并点击 Next 按钮。
        4. 输入 XA 属性并点击 Next
        5. Create XA Datasource 向导里输入连接设置。
        6. 点击 Test Connection 按钮测试到 XA 数据源的连接并检验设置是否正确。
        7. 点击 Done 完成。
结果

XA 数据源已被添加至服务器。它在 standalone.xmldomain.xml 文件以及管理界面里都可见。

6.4.2. 用管理界面修改 XA 数据源

介绍

本节涵盖用管理控制台或管理 CLI 修改 XA 数据源所需的步骤。

过程 6.9. 用管理 CLI 或管理控制台修改 XA 数据源

    • 管理 CLI

      1. 配置 XA 数据源属性

        使用 write-attribute 命令来配置数据源属性:
        /subsystem=datasources/xa-data-source=XA_DATASOURCE_NAME:write-attribute(name=ATTRIBUTE_NAME,value=ATTRIBUTE_VALUE)
      2. 配置 XA 数据源属性

        运行下列命令来配置 XA 数据源子资源:
        /subsystem=datasources/xa-data-source=DATASOURCE_NAME/xa-datasource-properties=PROPERTY_NAME:add(value=PROPERTY_VALUE)
      3. 重载服务器来确认修改:
        :reload
    • 管理控制台

      1. 进入管理控制台的 Datasources 面板

        1. 从控制台顶部选择 Configuration 标签页。
        2. 对于域模式,从左上角的下拉菜单里选择合适的配置集。
        3. 展开控制台左侧的 Subsystems 菜单,然后展开 Connector 菜单。
        4. 选择 Datasources
      2. 选择 XA Datasource 标签页。
      3. 编辑数据源

        1. Available XA Datasources 列表里选择相关的数据源。XA 数据源属性显示在下面的 Attributes 面板上。
        2. 选择 Edit 按钮来编辑数据源属性。
        3. 编辑 XA 数据源属性并在完成时选择 Save 按钮。
结果

已完成对 XA 数据源的配置。这些修改在 standalone.xmldomain.xml 文件以及管理界面里都可见。

6.4.3. 用管理界面删除 XA 数据源

介绍

本节涵盖用管理控制台或管理 CLI 从 JBoss EAP 6 删除 XA 数据源所需的步骤。

过程 6.10. 用管理 CLI 或管理控制台删除 XA 数据源

    • 管理 CLI

      1. 运行下列命令来删除 XA 数据源:
        xa-data-source remove --name=XA_DATASOURCE_NAME
    • 管理控制台

      1. 进入管理控制台的 Datasources 面板

        1. 从控制台顶部选择 Configuration 标签页。
        2. 对于域模式,从左上角的下拉菜单里选择合适的配置集。
        3. 展开控制台左侧的 Subsystems 菜单,然后展开 Connector 菜单。
        4. 选择 Datasources
      2. 选择 XA Datasource 标签页。
      3. 选择要删除的 XA 数据源,然后点击 Remove 按钮来永久地删除这个 XA 数据源。
结果

XA 数据源已从服务器删除。

6.4.4. XA Recovery

6.4.4.1. 关于 XA Recovery 模块

每个 XA 资源都需要一个 recovery 模块与其配置相关联。这个 recovery 模块必须继承 com.arjuna.ats.jta.recovery.XAResourceRecovery
JBoss EAP 6 为 JDBC 和 JMS XA 资源提供了 recovery 模块。对于这些类型的资源,recovery 模块会自动注册。如果您需要使用自定义模块,您可以在自己的数据源里注册它。

6.4.4.2. 配置 XA Recovery 模块

对于多数 JDBC 和 JMS 资源,recovery 模块自动和资源相关联。在这些情况下,您只需要配置选项以允许 recovery 模块连接到您的资源来执行恢复。
对于非 JDBC 或 JMS 的自定义资源,请联系 Red Hat 全球支持服务获取受支持的配置的信息。
每个配置属性都可以在数据源创建过程中或之后设置。你可以用基于 web 的管理控制台或命令行管理 CLI 进行设置。关于配置 XA 数据源的信息,请参考 第 6.4.1 节 “用管理界面创建 XA 数据源”第 6.4.2 节 “用管理界面修改 XA 数据源”
参考下列表里的常用数据源配置属性,以及和专有数据库供应商相关的配置细节。

表 6.2. 常用的配置属性

属性 描述
recovery-username
recovery 模块应该用来连接资源进行恢复的用户名。
recovery-password
recovery 模块应该用来连接资源进行恢复的密码。
recovery-security-domain
recovery 模块应该用来连接资源进行恢复的安全域。
recovery-plugin-class-name
如果你需要使用自定义的 recovery 模块,请将这个属性设置为模块的全限定名。这个模块应该继承 com.arjuna.ats.jta.recovery.XAResourceRecovery 类。
recovery-plugin-properties
如果你使用了要求设置属性的自定义 recovery 模块,请将这个属性设置为用逗号隔开的 key=value 对的列表。

供应商专有的配置信息

Oracle
如果错误地配置了 Oracle 数据源,您可能会在日志输出里看到这样的错误:
WARN  [com.arjuna.ats.jta.logging.loggerI18N] [com.arjuna.ats.internal.jta.recovery.xarecovery1] Local XARecoveryModule.xaRecovery  got XA exception javax.transaction.xa.XAException, XAException.XAER_RMERR
要解决这个错误,请确保 recovery-username 里配置的 Oracle 用户可以访问恢复所需的表。下面是安装了 Oracle bug 5945463 补丁的 Oracle 11g 或 Oracle 10g R2 实例的正确 Grant SQL 语句。
GRANT SELECT ON sys.dba_pending_transactions TO recovery-username;
GRANT SELECT ON sys.pending_trans$ TO recovery-username;
GRANT SELECT ON sys.dba_2pc_pending TO recovery-username;
GRANT EXECUTE ON sys.dbms_xa TO recovery-username;
如果你使用了 11g 以前的 Oracle 11 版本,请将最后的 EXECUTE 语句修改为:
	GRANT EXECUTE ON sys.dbms_system TO recovery-username;
PostgreSQL
关于启用 pepared (也就是 XA)事务的说明请阅读 PostgreSQL 文档。PostgreSQL 的 JDBC 驱动的 8.4-701 版本在 org.postgresql.xa.PGXAConnection 里有一个程序错误,它在某些情况下会中断恢复。在更新的版本里我们会修复这个问题。
MySQL
根据 http://bugs.mysql.com/bug.php?id=12161,XA 事务恢复在 MySQL 5 的某些版本里无法运行。MySQL 6.1 里已解决了这个问题。详情请参考 bug URL 或 MySQL 文档。
IBM DB2
IBM DB2 期望 XAResource.recover 方法只是在应用服务器发生崩溃或故障后重启时的重同步阶段才被调用。这是 DB2 实现里的设计问题,超出了本文档的范畴。
Sybase
Sybase 期望在数据库启用 XA 事务。如果没有正确的数据库配置,XA 事务将无法工作。enable xact coordination 启用或禁用 Adaptive Server 事务协调(transaction coordination)服务。当启用这个参数时,Adaptive Server 确保对远程 Adaptive Server 数据提交或用原始事务进行回滚。要启用事务协调,请使用:
sp_configure 'enable xact coordination', 1
.

6.5. 数据源安全性

6.5.1. 关于数据源安全性

数据源安全性的首选方案是使用安全域或密码阀。下面是它们各自的例子。关于更多的信息,请参考:

例 6.8. 安全域示例

<security>
   <security-domain>mySecurityDomain</security-domain>
</security>

例 6.9. 密码阀示例

<security>
  <user-name>admin</user-name>
  <password>${VAULT::ds_ExampleDS::password::N2NhZDYzOTMtNWE0OS00ZGQ0LWE4MmEtMWNlMDMyNDdmNmI2TElORV9CUkVBS3ZhdWx0}</password>
</security>

6.6. 数据源配置

6.6.1. 数据源参数

表 6.3. XA 和非 XA 数据源共用的数据源参数

参数 描述
jndi-name 数据源的唯一 JNDI 名称。
pool-name 数据源的管理池的名称。
enabled 是否启用数据源
use-java-context
是否绑定数据源到全局 JNDI。
spy
启用 JDBC 层的 spy 功能。这会将所有 JDBC 通讯记录到数据源。请注意 logging 子系统里的日志类别 jboss.jdbc.spy 的级别也必须设置为 DEBUG
use-ccm 启用缓存连接管理者。
new-connection-sql 当连接被添加到连接池时会执行的 SQL 语句。
transaction-isolation
下列值之一:
  • TRANSACTION_READ_UNCOMMITTED
  • TRANSACTION_READ_COMMITTED
  • TRANSACTION_REPEATABLE_READ
  • TRANSACTION_SERIALIZABLE
  • TRANSACTION_NONE
url-delimiter 用于高可用性(HA)群集数据库的 connection-url 的分隔符。
url-selector-strategy-class-name 实现 org.jboss.jca.adapters.jdbc.URLSelectorStrategy 接口的类。
security
包含设置安全性的子元素。请参考 表 6.8 “安全性参数”
validation
包含设置有效性的子元素。 请参考 表 6.9 “用于检验的参数”
timeout
包含设置超时的子元素。请参考 表 6.10 “超时参数”
statement
包含设置语句的子元素。请参考 表 6.11 “语句参数”

表 6.4. Non-XA 数据源参数

参数 描述
jta 为非 XA 数据源启动 JTA 集成。不适用于 XA 数据源。
connection-url JDBC 驱动连接的 URL。
driver-class JDBC 驱动类的全限定名。
connection-property
传递给 Driver.connect(url,props) 方法的任意连接属性。每个 connection-property 都指定一个字符串/值对。属性名称来自元素名称,而值来自元素的内容。
pool
包含设置池的子元素。请参考 表 6.6 “non-XA 和 XA 数据源公用的池参数”

表 6.5. XA 数据源参数

参数 描述
xa-datasource-property
分配给 XADataSource 类实现的属性。通过 name=value 指定。如果存在 setName 格式的 setter 方法,这个属性将通过调用 setName(value) 格式的 setter 方法来设置。
xa-datasource-class
javax.sql.XADataSource 实现的全限定名。
driver
对包含 JDBC 驱动的 classloader 模块的唯一引用。有效的格式是 driverName#majorVersion.minorVersion
xa-pool
recovery
包含设置恢复的子元素。请参考 表 6.12 “恢复参数”

表 6.6. non-XA 和 XA 数据源公用的池参数

参数 描述
min-pool-size 池里可保留的连接的最小数量。
max-pool-size 池里可保留的连接的最大数量。
prefill 是否预先填充连接池。空的元素表示 true 值。默认为 false
use-strict-min pool-size 是否是严格规定的。默认为 false
flush-strategy
在发生错误时是否冲刷池。有效值为:
  • FailingConnectionOnly
  • IdleConnections
  • EntirePool
默认值为 FailingConnectionOnly
allow-multiple-users 指定是否有多个用户将通过 getConnection(user, password) 访问数据源,且内部池类型是否应该计入在内。

表 6.7. XA 池参数

参数 描述
is-same-rm-override javax.transaction.xa.XAResource.isSameRM(XAResource) 类是否返回 truefalse
interleaving 是否启用 XA 连接工厂的 interleaving。
no-tx-separate-pools
是否为每个上下文创建单独的子池。对于 Oracel 数据源来说这是必需的,它不允许 XA 连接既在 JTA 内部又在外部使用。
使用这个选项将导致您的池大小两倍于 max-pool-size,因为这实际会创建两个池。
pad-xid 是否拆分 Xid。
wrap-xa-resource
是否将 XAResource 包裹在 org.jboss.tm.XAResourceWrapper 实例里。

表 6.8. 安全性参数

参数 描述
user-name 创建新连接使用的用户名。
password 创建新连接使用的密码。
security-domain 非 XA 数据源参数
reauth-plugin 定义一个重验证插件以用于重新验证物理连接。

表 6.9. 用于检验的参数

参数 描述
valid-connection-checker
提供 SQLException.isValidConnection(Connection e) 方法来检验连接的 org.jboss.jca.adaptors.jdbc.ValidConnectionChecker 接口的实现。异常表示连接已被销毁。它覆盖了 check-valid-connection-sql 参数(如果存在)。
check-valid-connection-sql 检查池连接有效性的 SQL 语句。当从池里获取受管连接进行使用时它会被调用。
validate-on-match
指定当连接工厂试图对给定的集合匹配受管连接时是否执行连接级别的检验。
我们通常不会同时指定 validate-on-matchbackground-validation 为 true。但客户在使用连接前必须进行检验时则需要 Validate-on-match。这个参数默认为 false。
background-validation
指定连接在背景线程上进行检验。背景检验不和 validate-on-match 一起使用是一种性能优化。如果 validate-on-match 为 true 时,使用 background-validation 可能导致冗余的检查。背景检验可能会让用户用到有问题的连接(连接在返回给客户和检验扫描之间可能会出现问题),所以客户应用程序必须考虑到这种可能性。
background-validation-millis 背景检验运行的时间(毫秒)。
use-fast-fail
如果为 true,在第一次尝试时如果连接无效则失败。默认为 false
stale-connection-checker
提供 Boolean isStaleConnection(SQLException e) 方法的 org.jboss.jca.adapters.jdbc.StaleConnectionChecker 实例。如果这个方法返回 true,异常将包裹在 org.jboss.jca.adapters.jdbc.StaleConnectionExceptionSQLException 的子类)里。
exception-sorter
提供 Boolean isExceptionFatal(SQLException e) 方法的 org.jboss.jca.adapters.jdbc.ExceptionSorter 实例。这个方法检验异常是否作为 connectionErrorOccurred 消息传播到所有的 javax.resource.spi.ConnectionEventListener 实例上。

表 6.10. 超时参数

参数 描述
use-try-lock 使用 tryLock() 而不是 lock()。在指定秒数内试图获取锁,而不是在锁不可用时立即失败。默认值为 60 秒。如果超时为 5 分钟,则应设置 <use-try-lock>300</use-try-lock>
blocking-timeout-millis 等待连接时阻塞的最长时间(毫秒)。超过这个时间后,异常将被抛出。这只是在等待连接许可时阻塞,如果创建新连接花费很长时间并不会抛出异常。默认值为 30000,也就是 30 秒。
idle-timeout-minutes
在空闲连接关闭前的最长等待时间(分钟)。实际的最长时间取决于 idleRemover 扫描时间,它是任何池的最小 idle-timeout-minutes 的一半。
set-tx-query-timeout
是否根据事务超时前剩下的时间设置查询超时。如果没有事务存在则使用任何配置好的查询超时时间。默认为 false
query-timeout 查询的超时时间(秒)。默认是无超时。
allocation-retry 在抛出异常前,重新尝试分配连接的次数。默认为 0,异常将在第一次失败时抛出。
allocation-retry-wait-millis
在重新分配连接前应等待的时间(毫秒)。默认值是 5000,也就是 5 秒。
xa-resource-timeout
如果为非零值,这个值将传递给 XAResource.setTransactionTimeout 方法。

表 6.11. 语句参数

参数 描述
track-statements
当连接返回池且语句返回到 prepared 语句缓存时是否检测未关闭的语句。如果为 false,则不会对语句进行追踪。

有效值

  • true: : 对语句和结果集进行跟踪,如果没有关闭则提示警告。
  • false: 对语句和结果集都不进行跟踪。
  • nowarn: 语句将被跟踪但不会发出警告。这是默认设置。
prepared-statement-cache-size 每个连接的 prepared 语句的个数,存在于 Least Recently Used (LRU) 缓存里。
share-prepared-statements
是否两次请求相同的底层 prepared 语句而不关闭它。默认是 false

表 6.12. 恢复参数

参数 描述
recover-credential 安全域用于恢复的用户名/密码对。
recover-plugin
用于恢复的 org.jboss.jca.core.spi.recoveryRecoveryPlugin 类的实现。

6.6.2. 数据源连接 URL

表 6.13. 数据源连接 URL

数据源 数据源 URL
PostgreSQL jdbc:postgresql://SERVER_NAME:PORT/DATABASE_NAME
MySQL jdbc:mysql://SERVER_NAME:PORT/DATABASE_NAME
Oracle jdbc:oracle:thin:@ORACLE_HOST:PORT:ORACLE_SID
IBM DB2 jdbc:db2://SERVER_NAME:PORT/DATABASE_NAME
Microsoft SQLServer jdbc:microsoft:sqlserver://SERVER_NAME:PORT;DatabaseName=DATABASE_NAME

6.6.3. 数据源扩展

数据源部署可以使用 JDBC 资源适配器里的几个扩展来改进连接检验,并检查异常是否应该重新建立连接。这些扩展是:

表 6.14. 数据源扩展

数据源扩展 配置参数 描述
org.jboss.jca.adapters.jdbc.spi.ExceptionSorter <exception-sorter> 检查 SQLException 对于抛出它的连接是否是毁灭性的
org.jboss.jca.adapters.jdbc.spi.StaleConnection <stale-connection-checker> 将过时的 SQLExceptions 包裹在 org.jboss.jca.adapters.jdbc.StaleConnectionException
org.jboss.jca.adapters.jdbc.spi.ValidConnection <valid-connection-checker> 检查连接是否有效,能为应用程序所用。
JBoss EAP 6 也为几个受支持的数据库实现了这些扩展。

扩展实现

通用
  • org.jboss.jca.adapters.jdbc.extensions.novendor.NullExceptionSorter
  • org.jboss.jca.adapters.jdbc.extensions.novendor.NullStaleConnectionChecker
  • org.jboss.jca.adapters.jdbc.extensions.novendor.NullValidConnectionChecker
  • org.jboss.jca.adapters.jdbc.extensions.novendor.JDBC4ValidConnectionChecker
PostgreSQL
  • org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter
  • org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker
MySQL
  • org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter
  • org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLReplicationValidConnectionChecker
  • org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker
IBM DB2
  • org.jboss.jca.adapters.jdbc.extensions.db2.DB2ExceptionSorter
  • org.jboss.jca.adapters.jdbc.extensions.db2.DB2StaleConnectionChecker
  • org.jboss.jca.adapters.jdbc.extensions.db2.DB2ValidConnectionChecker
Sybase
  • org.jboss.jca.adapters.jdbc.extensions.sybase.SybaseExceptionSorter
  • org.jboss.jca.adapters.jdbc.extensions.sybase.SybaseValidConnectionChecker
Microsoft SQLServer
  • org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker
Oracle
  • org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter
  • org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker
  • org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker

6.6.4. 查看数据源统计

您可以用下列命令从定义的数据源里查看 jdbcpool 的统计信息:

过程 6.11. 

  • /subsystem=datasources/data-source=ExampleDS/statistics=jdbc:read-resource(include-runtime=true)
    
    /subsystem=datasources/data-source=ExampleDS/statistics=pool:read-resource(include-runtime=true)
    

注意

确保您指定了 include-runtime=true 参数,因为所有统计都是 runtime 信息。默认值为 false

6.6.5. 数据源统计

核心统计信息

下表包含受支持的数据源核心统计信息列表:

表 6.15. 核心统计信息

名称 描述
ActiveCount
活动连接的数量。每个连接都是正在被应用程序使用或是在池里备用。
AvailableCount
池里可用连接的数量。
AverageBlockingTime
获取池里排他锁时阻塞的平均时间。单位为毫秒。
AverageCreationTime
创建连接所花费的平均时间。单位为毫秒。
CreatedCount
创建的连接数量。
DestroyedCount
销毁的连接数量。
InUseCount
正在使用的连接的数量。
MaxCreationTime
创建连接所花费的最长时间。单位为毫秒。
MaxUsedCount
使用的连接的最大数目。
MaxWaitCount
同一时间等待连接的请求的最大数目。
MaxWaitTime
等待池里排他锁所花费的最长时间。
TimedOut
超时连接的数量。
TotalBlockingTime
等待池里排他锁总共所花费的时间。单位为毫秒。
TotalCreationTime
创建连接总共所花费的时间。单位为毫秒。
WaitCount
需要等待连接的请求的数量。
JDBC 统计信息

下表包含受支持的数据源 JDBC 统计信息列表:

表 6.16. JDBC 统计信息

名称 描述
PreparedStatementCacheAccessCount
语句缓存被访问的次数。
PreparedStatementCacheAddCount
添加到语句缓存里的语句数量。
PreparedStatementCacheCurrentSize
目前缓存在语句缓存里的 prepared 和可调用的语句的数量。
PreparedStatementCacheDeleteCount
从缓存里丢弃的语句的数量。
PreparedStatementCacheHitCount
语句在缓存里被使用的次数。
PreparedStatementCacheMissCount
对缓存里语句的请求无法被满足的次数。
您可以用下列命令的何合适版本启用 CoreJDBC 的统计信息:
  • /subsystem=datasources/data-source=ExampleDS/statistics=pool:write-attribute(name=statistics-enabled,value=true)
    
    /subsystem=datasources/data-source=ExampleDS/statistics=jdbc:write-attribute(name=statistics-enabled,value=true)
    

6.7. 数据源示例

6.7.1. PostgreSQL 数据源示例

例 6.10. 

下面的例子是一个 PostgreSQL 数据源配置。这个数据源已被启用,用户已经添加并已设置了检验选项。
<datasources>
  <datasource jndi-name="java:jboss/PostgresDS" pool-name="PostgresDS">
    <connection-url>jdbc:postgresql://localhost:5432/postgresdb</connection-url>
    <driver>postgresql</driver>
    <security>
      <user-name>admin</user-name>
      <password>admin</password>
    </security>
    <validation>
      <background-validation>true</background-validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"></valid-connection-checker>
      <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"></exception-sorter>
    </validation>
  </datasource>
  <drivers>
    <driver name="postgresql" module="org.postgresql">
      <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
    </driver>
  </drivers>
</datasources>
下面是用于上面的 PostgreSQL 数据源的 module.xml 文件示例。
<module xmlns="urn:jboss:module:1.1" name="org.postgresql">
  <resources>
    <resource-root path="postgresql-9.1-902.jdbc4.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

6.7.2. PostgreSQL XA 数据源示例

例 6.11. 

下面的例子是一个 PostgreSQL XA 数据源配置。这个数据源已被启用,用户已经添加并已设置了检验选项。
<datasources>
  <xa-datasource jndi-name="java:jboss/PostgresXADS" pool-name="PostgresXADS">
    <driver>postgresql</driver>
    <xa-datasource-property name="ServerName">localhost</xa-datasource-property>
    <xa-datasource-property name="PortNumber">5432</xa-datasource-property>
    <xa-datasource-property name="DatabaseName">postgresdb</xa-datasource-property>
    <security>
      <user-name>admin</user-name>
      <password>admin</password>
    </security>
    <validation>
      <background-validation>true</background-validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker">
      </valid-connection-checker>
      <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter">
      </exception-sorter>
    </validation>
  </xa-datasource>
  <drivers>
    <driver name="postgresql" module="org.postgresql">
      <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
    </driver>
  </drivers>
</datasources>
下面是用于上面的 PostgreSQL XA 数据源的 module.xml 文件示例。
<module xmlns="urn:jboss:module:1.1" name="org.postgresql">
  <resources>
    <resource-root path="postgresql-9.1-902.jdbc4.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

6.7.3. MySQL 数据源示例

例 6.12. 

下面的例子是一个 MySQL 数据源配置。这个数据源已被启用,用户已经添加并已设置了检验选项。
<datasources>
  <datasource jndi-name="java:jboss/MySqlDS" pool-name="MySqlDS">
    <connection-url>jdbc:mysql://mysql-localhost:3306/jbossdb</connection-url>
    <driver>mysql</driver>
    <security>
      <user-name>admin</user-name>
      <password>admin</password>
    </security> 
    <validation>
      <background-validation>true</background-validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"></valid-connection-checker>
      <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"></exception-sorter>
    </validation>
  </datasource>
  <drivers>
    <driver name="mysql" module="com.mysql">
      <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
    </driver>
  </drivers>
</datasources>
下面是用于上面的 MySQL 数据源的 module.xml 文件示例。
<module xmlns="urn:jboss:module:1.1" name="com.mysql">
  <resources>
    <resource-root path="mysql-connector-java-5.0.8-bin.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

6.7.4. MySQL XA 数据源示例

例 6.13. 

下面的例子是一个 MySQL XA 数据源配置。这个数据源已被启用,用户已经添加并已设置了检验选项。
<datasources>
  <xa-datasource jndi-name="java:jboss/MysqlXADS" pool-name="MysqlXADS">
  <driver>mysql</driver>
    <xa-datasource-property name="ServerName">localhost</xa-datasource-property>
    <xa-datasource-property name="DatabaseName">mysqldb</xa-datasource-property>
    <security>
      <user-name>admin</user-name>
      <password>admin</password>
    </security>
    <validation>
      <background-validation>true</background-validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"></valid-connection-checker>
      <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"></exception-sorter>
    </validation>
  </xa-datasource>
  <drivers>
    <driver name="mysql" module="com.mysql">
      <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
    </driver>
  </drivers>
</datasources>
下面是用于上面的 MySQL XA 数据源的 module.xml 文件示例。
<module xmlns="urn:jboss:module:1.1" name="com.mysql">
  <resources>
    <resource-root path="mysql-connector-java-5.0.8-bin.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

6.7.5. Oracle 数据源示例

注意

在 Oracle 数据源 10.2 之前的版本里,<no-tx-separate-pools/> 参数是必需的,因为非事务性和事务性连接的混合可能导致错误。对于某些应用程序来说,这个参数已不再是必需的了。

例 6.14. 

下面的例子是一个 Oracle 数据源配置。这个数据源已被启用,用户已经添加并已设置了检验选项。
<datasources>
  <datasource jndi-name="java:/OracleDS" pool-name="OracleDS">
    <connection-url>jdbc:oracle:thin:@localhost:1521:XE</connection-url>
    <driver>oracle</driver>
    <security>
      <user-name>admin</user-name>
      <password>admin</password>
    </security> 
    <validation>
      <background-validation>true</background-validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"></valid-connection-checker>
      <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"></stale-connection-checker>
      <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"></exception-sorter>
    </validation>
  </datasource>
  <drivers>
    <driver name="oracle" module="com.oracle">
      <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
    </driver>
  </drivers>
</datasources>
下面是用于上面的 Oracle 数据源的 module.xml 文件示例。
<module xmlns="urn:jboss:module:1.1" name="com.oracle">
  <resources>
    <resource-root path="ojdbc6.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

6.7.6. Oracle XA 数据源示例

注意

在 Oracle 数据源 10.2 之前的版本里,<no-tx-separate-pools/> 参数是必需的,因为非事务性和事务性连接的混合可能导致错误。对于某些应用程序来说,这个参数已不再是必需的了。

重要

下面的设置必须应用于访问 Oracle XA 数据源的用户以使 XA 恢复可以正常操作。user 的值是连接 JBoss 到 Oracle 的用户:
  • GRANT SELECT ON sys.dba_pending_transactions TO user;
  • GRANT SELECT ON sys.pending_trans$ TO user;
  • GRANT SELECT ON sys.dba_2pc_pending TO user;
  • GRANT EXECUTE ON sys.dbms_xa TO user; (If using Oracle 10g R2 (patched) or Oracle 11g)
    OR
    GRANT EXECUTE ON sys.dbms_system TO user; (If using an unpatched Oracle version prior to 11g)

例 6.15. 

下面的例子是一个 Oracle XA 数据源配置。这个数据源已被启用,用户已经添加并已设置了检验选项。
<datasources>
  <xa-datasource jndi-name="java:/XAOracleDS" pool-name="XAOracleDS">
    <driver>oracle</driver>
    <xa-datasource-property name="URL">jdbc:oracle:oci8:@tc</xa-datasource-property>
    <security>
      <user-name>admin</user-name>
      <password>admin</password>
    </security>
    <xa-pool>
      <is-same-rm-override>false</is-same-rm-override>
      <no-tx-separate-pools />
    </xa-pool>
    <validation>
      <background-validation>true</background-validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"></valid-connection-checker>
      <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"></stale-connection-checker>
      <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"></exception-sorter>
    </validation>
  </xa-datasource>
  <drivers>
    <driver name="oracle" module="com.oracle">
      <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
    </driver>
  </drivers>
</datasources>
下面是用于上面的 Oracle XA 数据源的 module.xml 文件示例。
<module xmlns="urn:jboss:module:1.1" name="com.oracle">
  <resources>
    <resource-root path="ojdbc6.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

6.7.7. Microsoft SQLServer 数据源示例

例 6.16. 

下面的例子是一个 Microsoft SQLServer 数据源配置。这个数据源已被启用,用户已经添加并已设置了检验选项。
<datasources>
  <datasource jndi-name="java:/MSSQLDS" pool-name="MSSQLDS">
    <connection-url>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=MyDatabase</connection-url>
    <driver>sqlserver</driver>
    <security>
      <user-name>admin</user-name>
      <password>admin</password>
    </security>
    <validation>
      <background-validation>true</background-validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"></valid-connection-checker>
    </validation>
  </datasource>
  <drivers>
    <driver name="sqlserver" module="com.microsoft">
      <xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</xa-datasource-class>
    </driver>
</datasources>
下面是用于上面的 Microsoft SQLServer 数据源的 module.xml 文件示例。
<module xmlns="urn:jboss:module:1.1" name="com.microsoft">
  <resources>
    <resource-root path="sqljdbc4.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

6.7.8. Microsoft SQLServer XA 数据源示例

例 6.17. 

下面的例子是一个 Microsoft SQLServer XA 数据源配置。这个数据源已被启用,用户已经添加并已设置了检验选项。
<datasources>
  <xa-datasource jndi-name="java:/MSSQLXADS" pool-name="MSSQLXADS">
    <driver>sqlserver</driver>
    <xa-datasource-property name="ServerName">localhost</xa-datasource-property>
    <xa-datasource-property name="DatabaseName">mssqldb</xa-datasource-property>
    <xa-datasource-property name="SelectMethod">cursor</xa-datasource-property>
    <security>
      <user-name>admin</user-name>
      <password>admin</password>
    </security>
    <xa-pool>
      <is-same-rm-override>false</is-same-rm-override>
    </xa-pool>
    <validation>
      <background-validation>true</background-validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"></valid-connection-checker>
    </validation>
  </xa-datasource>
  <drivers>
    <driver name="sqlserver" module="com.microsoft">
      <xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</xa-datasource-class>
    </driver>
  </drivers>
</datasources>
下面是用于上面的 Microsoft SQLServer XA 数据源的 module.xml 文件示例。
<module xmlns="urn:jboss:module:1.1" name="com.microsoft">
  <resources>
    <resource-root path="sqljdbc4.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

6.7.9. IBM DB2 数据源示例

例 6.18. 

下面的例子是一个 IBM DB2 数据源配置。这个数据源已被启用,用户已经添加并已设置了检验选项。
<datasources>
  <datasource jndi-name="java:/DB2DS" pool-name="DB2DS">
    <connection-url>jdbc:db2:ibmdb2db</connection-url>
    <driver>ibmdb2</driver>
    <pool>
      <min-pool-size>0</min-pool-size>
      <max-pool-size>50</max-pool-size>
    </pool>
    <security>
      <user-name>admin</user-name>
      <password>admin</password>
    </security> 
    <validation>
      <background-validation>true</background-validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.db2.DB2ValidConnectionChecker"></valid-connection-checker>
      <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.db2.DB2StaleConnectionChecker"></stale-connection-checker>
      <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.db2.DB2ExceptionSorter"></exception-sorter>
    </validation>
  </datasource>
  <drivers>
    <driver name="ibmdb2" module="com.ibm">
      <xa-datasource-class>com.ibm.db2.jdbc.DB2XADataSource</xa-datasource-class>
    </driver>
  </drivers>
</datasources>

下面是用于上面的 IBM DB2 数据源的 module.xml 文件示例。
<module xmlns="urn:jboss:module:1.1" name="com.ibm">
  <resources>
    <resource-root path="db2jcc4.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

6.7.10. IBM DB2 XA 数据源示例

例 6.19. 

下面的例子是一个 IBM DB2 XA 数据源配置。这个数据源已被启用,用户已经添加并已设置了检验选项。
<datasources>
  <xa-datasource jndi-name="java:/DB2XADS" pool-name="DB2XADS">
    <driver>ibmdb2</driver>
    <xa-datasource-property name="DatabaseName">ibmdb2db</xa-datasource-property>
    <xa-datasource-property name="ServerName">hostname</xa-datasource-property>
    <xa-datasource-property name="PortNumber">port</xa-datasource-property>
    <security>
      <user-name>admin</user-name>
      <password>admin</password>
    </security>
    <xa-pool>
      <is-same-rm-override>false</is-same-rm-override>
    </xa-pool>
    <validation>
      <background-validation>true</background-validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.db2.DB2ValidConnectionChecker"></valid-connection-checker>
      <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.db2.DB2StaleConnectionChecker"></stale-connection-checker>
      <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.db2.DB2ExceptionSorter"></exception-sorter>
    </validation>
    <recovery>
      <recover-plugin class-name="org.jboss.jca.core.recovery.ConfigurableRecoveryPlugin">
        <config-property name="EnableIsValid">false</config-property>
        <config-property name="IsValidOverride">false</config-property>
        <config-property name="EnableClose">false</config-property>
      </recover-plugin>
    </recovery>
  </xa-datasource>
  <drivers>
    <driver name="ibmdb2" module="com.ibm">
      <xa-datasource-class>com.ibm.db2.jcc.DB2XADataSource</xa-datasource-class>
    </driver>
  </drivers>
</datasources>
下面是用于上面的 IBM DB2 XA 数据源的 module.xml 文件示例。
<module xmlns="urn:jboss:module:1.1" name="com.ibm">
  <resources>
    <resource-root path="db2jcc4.jar"/>
    <resource-root path="db2jcc_license_cisuz.jar"/>
    <resource-root path="db2jcc_license_cu.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

6.7.11. Sybase 数据源示例

例 6.20. 

下面的例子是一个 Sybase 数据源配置。这个数据源已被启用,用户已经添加并已设置了检验选项。
<datasources>
  <datasource jndi-name="java:jboss/SybaseDB" pool-name="SybaseDB" enabled="true">
    <connection-url>jdbc:sybase:Tds:localhost:5000/DATABASE?JCONNECT_VERSION=6</connection-url>
    <security>
      <user-name>admin</user-name>
      <password>admin</password>
    </security>
    <validation>
      <background-validation>true</background-validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.sybase.SybaseValidConnectionChecker"></valid-connection-checker>
      <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.sybase.SybaseExceptionSorter"></exception-sorter>
    </validation>
  </datasource>
  <drivers>
    <driver name="sybase" module="com.sybase">
      <datasource-class>com.sybase.jdbc4.jdbc.SybDataSource</datasource-class>
      <xa-datasource-class>com.sybase.jdbc4.jdbc.SybXADataSource</xa-datasource-class>
    </driver>
  </drivers>
</datasources>
下面是用于上面的 Sybase 数据源的 module.xml 文件示例。
<module xmlns="urn:jboss:module:1.1" name="com.sybase">
  <resources>
    <resource-root path="jconn2.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

6.7.12. Sybase XA 数据源示例

例 6.21. 

下面的例子是一个 Sybase XA 数据源配置。这个数据源已被启用,用户已经添加并已设置了检验选项。
<datasources>
  <xa-datasource jndi-name="java:jboss/SybaseXADS" pool-name="SybaseXADS" enabled="true">
    <xa-datasource-property name="NetworkProtocol">Tds</xa-datasource-property>
    <xa-datasource-property name="ServerName">myserver</xa-datasource-property>
    <xa-datasource-property name="PortNumber">4100</xa-datasource-property>
    <xa-datasource-property name="DatabaseName">mydatabase</xa-datasource-property>
    <security>
      <user-name>admin</user-name>
      <password>admin</password>
    </security>
    <validation>
      <background-validation>true</background-validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.sybase.SybaseValidConnectionChecker"></valid-connection-checker>
      <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.sybase.SybaseExceptionSorter"></exception-sorter>
    </validation>
  </xa-datasource>
  <drivers>
    <driver name="sybase" module="com.sybase">
      <datasource-class>com.sybase.jdbc4.jdbc.SybDataSource</datasource-class>
      <xa-datasource-class>com.sybase.jdbc4.jdbc.SybXADataSource</xa-datasource-class>
    </driver>
  </drivers>
</datasources>
下面是用于上面的 Sybase XA 数据源的 module.xml 文件示例。
<module xmlns="urn:jboss:module:1.1" name="com.sybase">
  <resources>
    <resource-root path="jconn2.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

第 7 章 配置模块

7.1. 介绍

7.1.1. 模块

模块是用于类加载和依赖关系管理的类的逻辑组。JBoss EAP 6 使用两种模块类型,有时称为静态和动态模块。然而,这两者的区别只是它们打包的方式。所有模块都提供相同的功能。
静态模块
静态模块是在应用服务器的 EAP_HOME/modules/ 目录里进行预定义的。每个子目录都代表一个模块并包含一个配置文件(module.xml)或所需的 JAR 文件。模块的名称是在 module.xml 文件里定义的。所有应用服务器提供的 API 都是作为静态模块提供的,包括 Java EE API 以及其他 API(如 Jboss Logging)。

例 7.1. module.xml 文件示例

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.mysql">
  <resources>
    <resource-root path="mysql-connector-java-5.1.15.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

模块名 com.mysql 应该匹配这个模块的目录结构。
JBoss EAP 里提供的模块位于 JBOSS_HOME/modules 里的 system 目录。这使它们和第三方体的模块隔离开来。
Red Hat 提供的任何高于 JBoss EAP 6.1 或更高版本的分层产品也会安装它们的模块到 system 目录里。
如果许多使用相同第三方库的应用程序部署在相同的服务器上,那么创建自定义静态模块就很有用。不是将这些库捆绑到每个应用程序,而是由 JBoss 管理员创建和安装包含这些库的模块。然后应用程序就可以声明对自定义静态模块的显性依赖关系。
用户必须确保使用一个目录对应一个模块的格式将自定义的模块安装至 JBOSS_HOME/modules 目录。这可以确保系统加载已存在于 system 目录的模块的自定义版本,而不是系统附带的版本。因此,用户提供的模块将优先于系统模块。
如果您使用 JBOSS_MODULE_PATH 环境变量来修改 JBoss EAP 搜索模块的位置,那么产品将查找指定的位置中的 system 子目录结构。system 结构必须存在于用 JBOSS_MODULE_PATH 指定的位置中的某处。
动态模块
应用服务器为每个 JAR 或 WAR 部署(或 EAR 里的子部署)创建和加载动态模块。动态模块的名称源自部署的归档的名称。因为部署是作为模块加载的,它们可以配置依赖关系并被其他部署作为依赖关系使用。
模块只有在需要时才会加载。这通常只在具有显性或隐性依赖关系的应用程序部署时发生。

7.1.2. 全局模块

全局模块(Global Module)是 JBoss EAP 6 作为每个应用程序的依赖关系而提供的模块。将任何模块添加到应用服务器的全局模块列表里都可以使其成为全局模块,你并不需要修改模块。

7.1.3. 模块的依赖关系

模块依赖关系是某个模块要求另外一个模块的类行使功能的声明。模块可以声明对多个模块的依赖关系。当应用服务器加载一个模块时,模块类加载器将解析该模块的依赖关系并从每个依赖关系中添加类到 class path 里。如果无法找到指定的依赖关系,这个模块将加载失败。
部署的应用程序(JAR 和 WAR)将被加载为动态模块并使用依赖关系来访问 JBoss EAP 6 提供的 API。
依赖关系的类型有两种:explicit(显性的)和 implicit(隐性的)
显性依赖关系是由开发人员声明的。静态的模块可以在 modules.xml 文件里声明依赖关系。动态模块可以在 MANIFEST.MF 或 jboss-deployment-structure.xml 里声明依赖关系。
您可以指定显性的依赖关系为可选的。无法加载可选依赖关系不会导致模块无法加载。然而,如果依赖关系以后变成可用时,它将无法添加到模块的 Class path 里。模块加载时依赖关系就必须是可用的。
隐性的依赖关系在某些条件满足或在部署里发现元数据时自动由应用服务器添加。JBoss EAP 6 附带的 Java EE 6 API 是通过检测部署里的隐性依赖关系而添加的模块的示例。
我们可以配置部署排除特定的隐性依赖关系。这是通过 jboss-deployment-structure.xml 部署描述符文件来完成的。这常常发生在当应用程序捆绑某个版本的库文件,而应用服务器将试图将其添加为隐性依赖关系的时候。
模块的 Class path 包含自己的类及其直接的依赖关系。模块无法访问其中一个依赖关系的依赖关系类。然而,模块可以指定导出某个显性的依赖关系。导出的依赖关系将提供给任何依赖于导出它的模块的模块。

例 7.2. 模块依赖关系

模块 A 依赖于模块 B 而模块 B 依赖于模块 C。模块 A 可以访问模块 B 的类,模块 B 可以访问模块 C 的类。模块 A 无法访问模块 C 的类。
  • 模块 A 声明了对模块 C 的显性依赖关系,或者
  • 模块 B 导出它对模块 C 的依赖关系。

7.1.4. 子部署类加载器的隔离

EAR 里的每个子部署都是一个动态模块,它有自己的类加载器。在默认情况下,子部署可以访问其他子部署的资源。
如果子部署不应该访问其他子部署的资源(要求严格的子部署隔离),那么就可以启用隔离。

7.2. 对所有的部署禁用子部署模块隔离(Sub-Deployment Module Isolation)

这个任务展示了服务器管理员在应用服务期上如何禁用子部署模块隔离。这会影响到所有的部署。

警告

这个任务要求您编辑服务器的 XML 配置文件。编辑前这个服务器必须先暂停,这是临时措施,最终版本的管理工具将会支持这种配置。
  1. 停止服务器

    暂停 JBoss EAP 6 服务器。
  2. 打开服务器配置文件

    在文本编辑器里打开服务器配置文件。
    对于受管域和独立服务器这个文件是不同的。此外也可能使用非默认的位置和文件名称。对于受管域和独立服务器,默认的配置文件分别是 domain/configuration/domain.xmlstandalone/configuration/standalone.xml
  3. 定位 EE 子系统配置

    在配置文件里找到 EE 子系统配置元素。配置文件的 <profile> 元素包含了几个子系统元素。EE 子系统元素的命名空间是 urn:jboss:domain:ee:1.1
    <profile>
    
       ...
    
       <subsystem xmlns="urn:jboss:domain:ee:1.1" />
    
       ...
    默认的配置有一个自闭合的标签,但自定义的配置可能有单独的开和合标签(里面可能还有其他元素),如:
    <subsystem xmlns="urn:jboss:domain:ee:1.1" ></subsystem>
  4. 如果需要则替换自闭合的标签

    如果 EE Subsystem 元素是一个单个的自闭合标签,那么请用合适的开和合标签来替换,如:
    <subsystem xmlns="urn:jboss:domain:ee:1.1" ></subsystem>
  5. 添加 ear-subdeployments-isolated 元素

    ear-subdeployments-isolated 元素添加为 EE Subsystem 元素的子元素并添加 false 内容,如:
    <subsystem xmlns="urn:jboss:domain:ee:1.1" ><ear-subdeployments-isolated>false</ear-subdeployments-isolated></subsystem>
  6. 期待服务器

    重新启动 JBoss EAP 6 服务器以使用新的配置运行。
结果:

服务器现在对于所有部署都禁用了 Subdeployment Module Isolation。

7.3. 添加模块到所有部署里

这个任务展示了 JBoss 管理员如何定义全局模块列表。

必须具备的条件

  1. 您必须知道要配置为全局模块的模块的名称。关于 JBoss EAP 6 附带的静态模块的列表,请参考 第 7.5.1 节 “包括的模块”。如果这个模块是另外一个部署,请参考 第 7.5.2 节 “动态模块命名” 来确定模块名。

过程 7.1. 添加模块到全局模块列表里

  1. 进入 EE Subsystem 面板。
    1. 从控制台顶部选择 Configuration 标签页。
    2. 仅用于域模式

      1. 从左上角的下拉菜单里选择合适的配置集。
    3. 展开控制台左侧的 Subsystems 菜单。
    4. 从控制台左侧的菜单里选择 ContainerEE
  2. 点击 Subsystem Defaults 部分的 Add 按钮。Create Module 对话框将会出现。
  3. 输入模块名以及模块 slot(可选)。
  4. 点击 Save 按钮来添加新的全局模块,或者点击 Cancel 链接中止。
    • 如果您点击了 Save 按钮,对话框将关闭而指定的模块将被添加到全局模块列表里。
    • 如果您点击了 Cancel,对话框将关闭且不会保存任何修改。
结果

添加到全局模块列表的模块将作为依赖关系添加到每个部署里。

7.4. 定义外部 JBoss Modules 目录

介绍

在默认情况下,JBoss EAP 查找 EAP_HOME/modules/ 目录里的模块。通过定义 JBOSS_MODULEPATH 环境变量或在启动配置文件里设置变量,您可以指引 JBoss EAP 查找一个或多个外部目录。本节描述了这两个方法。

过程 7.2. 设置 JBOSS_MODULEPATH 环境变量

  • 要指定一个或更多的外部模块目录,请定义环境变量 JBOSS_MODULEPATH
    在 Linux 里,请使用冒号来隔开目录列表。例如:
    export JBOSS_MODULEPATH=EAP_HOME/modules/:/home/username/external/modules/directory/
    在 Windows 里,请使用分号来隔开目录列表。例如:
    SET JBOSS_MODULEPATH=EAP_HOME\modules\;D:\JBoss-Modules\

过程 7.3. 在 Startup 配置文件里设置 JBOSS_MODULEPATH 环境变量

  • 如果您不愿意设置全局环境变量,您可以在 JBoss EAP 启动配置文件里设置 JBOSS_MODULEPATH 变量。如果您运行的是独立服务器,配置文件是 EAP_HOME/bin/standalone.conf ;如果服务器运行在受管域里,配置文件是 EAP_HOME/bin/domain.conf
    下面是在 standalone.conf 文件里设置 JBOSS_MODULEPATH 变量的命令示例。
    JBOSS_MODULEPATH="EAP_HOME/modules/:/home/username/external/modules/directory/"

7.5. 参考

7.5.1. 包括的模块

您可以在客户门户找到 JBoss EAP 6 包含的模块列表以及是否受支持:https://access.redhat.com/articles/1122333

7.5.2. 动态模块命名

所有部署都被 JBoss EAP 6 加载为模块并按照下列规格进行命名。
  1. WAR 和JAR 文件的部署是用下列格式命名的:
     deployment.DEPLOYMENT_NAME 
    例如,inventory.warstore.jar 的模块名分别是deployment.inventory.wardeployment.store.jar
  2. EAR 里的子部署是用下列格式命名的:
     deployment.EAR_NAME.SUBDEPLOYMENT_NAME 
    例如,accounts.ear 里的 reports.war 子部署的模块名将是 deployment.accounts.ear.reports.war

第 8 章 Jsvc

8.1. 介绍

8.1.1. 关于 Jsvc

Jsvc 是一系列允许 Java 应用程序作为后台服务运行在 Unix 或类 Unix 平台里的库和应用程序。它允许应用程序作为特权用户执行操作,然后将其身份切换到非特权用户。
Jsvc 使用三个进程:launcher、controller 和 controlled 进程。controlled 进程也是主 Java 线程。如果 JVM 崩溃,controller 进程将在 60 秒内重启它。Jsvc 是 JBoss EAP 的守护进程,它只能由特权用户启动。

注意

Jsvc 仅用在 Red Hat Enterprise Linux、Solaris 和 HP-UX 里。关于 Microsoft Windows 上的类似功能,请使用 Red Hat 客户门户里 Native Utilities for Windows Serverprunsrv.exe

8.1.2. 用 Jsvc 启动和停止 JBoss EAP

根据操作模式的不同,用 Jsvc 启动和停止 JBoss EAP 的说明也会不同。请注意如果 JBoss EAP 运行在域模式里,Jsvc 只会负责域控制器的处理过程。不管您使用哪个命令通过 Jsvc 启动 JBoss EAP,它都必须用特权用户来运行。

必须具备的条件

  • 如果 JBoss EAP 6 是用 ZIP 方式安装的:
    • 从 Red Hat 客户门户下载并安装 Native Utilities 软件包。请参考《安装指南》里的『安装 Native 组件和 Native 工具(ZIP/安装程序)』章节。
    • 创建将运行JBoss EAP 6 实例的用户帐号。用来启动和停止服务器的帐号必须拥有读取和写入安装 JBoss EAP 的目录的权限。
  • 如果 JBoss EAP 是用 RPM 模式安装的,请安装 apache-commons-daemon-jsvc-eap6 软件包。请参考《安装指南》里的『安装 Native 组件和 Native 工具(RPM 安装)』章节。
下面的命令是在独立或域模式下启动和停止 JBoss EAP。请注意,根据安装 Jsvc 的方法的不同,文件的位置也会不同。请用下表来确定使用哪些文件来解析命令里的变量。
独立模式

下面的说明是关于在独立模式下启动和停止 JBoss EAP 的。

表 8.1. ZIP 安装模式下的 Jsvc 文件位置 - 独立模式

参考文件说明 文件位置
EAP-HOME
${eap-installation-location}/jboss-eap-${version}
JSVC-BIN
EAP_HOME/modules/system/layers/base/native/sbin/jsvc
JSVC-JAR
EAP_HOME/modules/system/layers/base/native/sbin/commons-daemon.jar
CONF-DIR
EAP_HOME/standalone/configuration
LOG-DIR
EAP_HOME/standalone/log

表 8.2. RPM 安装模式下的 Jsvc 文件位置 - 独立模式

参考文件说明 文件位置
EAP-HOME
/usr/share/jbossas
JSVC-BIN
/usr/bin/jsvc-eap6/jsvc
JSVC-JAR
EAP_HOME/modules/system/layers/base/native/sbin/commons-daemon.jar
CONF-DIR
/etc/jbossas/standalone
LOG-DIR
/var/log/jbossas/standalone

以独立模式启动 JBoss EAP

  • JSVC_BIN \
     -outfile LOG_DIR/jsvc.out.log   \
     -errfile LOG_DIR/jsvc.err.log   \
     -pidfile LOG_DIR/jsvc.pid  \
     -user jboss \
     -D[Standalone] -XX:+UseCompressedOops -Xms1303m \
     -Xmx1303m -XX:MaxPermSize=256m \
     -Djava.net.preferIPv4Stack=true 
     -Djboss.modules.system.pkgs=org.jboss.byteman \
     -Djava.awt.headless=true \
     -Dorg.jboss.boot.log.file=LOG_DIR/server.log \
     -Dlogging.configuration=file:CONF_DIR/logging.properties \
     -Djboss.modules.policy-permissions \
     -cp EAP_HOME/jboss-modules.jar:JSVC_JAR \
     -Djboss.home.dir=EAP_HOME \
     -Djboss.server.base.dir=EAP_HOME/standalone   \
     @org.jboss.modules.Main -start-method main \
     -mp EAP_HOME/modules \
     -jaxpmodule javax.xml.jaxp-provider \
     org.jboss.as.standalone

停止以独立模式运行的 JBoss EAP

  • JSVC_BIN \
     -stop \
     -outfile LOG_DIR/jsvc.out.log   \
     -errfile LOG_DIR/jsvc.err.log   \
     -pidfile LOG_DIR/jsvc.pid  \
     -user jboss \
     -D[Standalone] -XX:+UseCompressedOops -Xms1303m \
     -Xmx1303m -XX:MaxPermSize=256m \
     -Djava.net.preferIPv4Stack=true \
     -Djboss.modules.system.pkgs=org.jboss.byteman \
     -Djava.awt.headless=true \
     -Dorg.jboss.boot.log.file=LOG_DIR/server.log \
     -Dlogging.configuration=file:CONF_DIR/logging.properties \
     -Djboss.modules.policy-permissions \
     -cp EAP_HOME/jboss-modules.jar:JSVC_JAR \
     -Djboss.home.dir=EAP_HOME \
     -Djboss.server.base.dir=EAP_HOME/standalone   \
     @org.jboss.modules.Main -start-method main \
     -mp EAP_HOME/modules \
     -jaxpmodule javax.xml.jaxp-provider \
     org.jboss.as.standalone
域模式

下面的说明是关于在域模式下启动和停止 JBoss EAP 的。请注意对于域模式,您必须用 Java 主目录替换 JAVA_HOME 变量。

表 8.3. ZIP 安装模式下的 Jsvc 文件位置 - 域模式

参考文件说明 文件位置
EAP-HOME
${eap-installation-location}/jboss-eap-${version}
JSVC-BIN
EAP_HOME/modules/system/layers/base/native/sbin/jsvc
JSVC-JAR
EAP_HOME/modules/system/layers/base/native/sbin/commons-daemon.jar
CONF-DIR
EAP_HOME/domain/configuration
LOG-DIR
EAP_HOME/domain/log

表 8.4. RPM 安装模式下的 Jsvc 文件位置 - 域模式

参考文件说明 文件位置
EAP-HOME
/usr/share/jbossas
JSVC-BIN
/usr/bin/jsvc-eap6/jsvc
JSVC-JAR
EAP_HOME/modules/system/layers/base/native/sbin/commons-daemon.jar
CONF-DIR
/etc/jbossas/domain
LOG-DIR
/var/log/jbossas/domain

以域模式启动 JBoss EAP

  • JSVC_BIN \
     -outfile LOG_DIR/jsvc.out.log   \
     -errfile LOG_DIR/jsvc.err.log   \
     -pidfile LOG_DIR/jsvc.pid  \
     -user jboss \
     -nodetach -D"[Process Controller]" -server -Xms64m \
     -Xmx512m -XX:MaxPermSize=256m \
     -Djava.net.preferIPv4Stack=true  \
     -Djboss.modules.system.pkgs=org.jboss.byteman \
     -Djava.awt.headless=true  \
     -Dorg.jboss.boot.log.file=LOG_DIR/process-controller.log \
     -Dlogging.configuration=file:CONF_DIR/logging.properties \
     -Djboss.modules.policy-permissions \
     -cp "EAP_HOME/jboss-modules.jar:JSVC_JAR" \
     org.apache.commons.daemon.support.DaemonWrapper \
     -start org.jboss.modules.Main -start-method main \
     -mp EAP_HOME/modules org.jboss.as.process-controller \
     -jboss-home EAP_HOME -jvm $JAVA_HOME/bin/java \
     -mp EAP_HOME/modules -- \
     -Dorg.jboss.boot.log.file=LOG_DIR/host-controller.log \
     -Dlogging.configuration=file:CONF_DIR/logging.properties \
     -Djboss.modules.policy-permissions \
     -server -Xms64m -Xmx512m -XX:MaxPermSize=256m \
     -Djava.net.preferIPv4Stack=true \
     -Djboss.modules.system.pkgs=org.jboss.byteman \
     -Djava.awt.headless=true -- -default-jvm $JAVA_HOME/bin/java

停止以域模式运行的 JBoss EAP

  • JSVC_BIN \
     -stop \
     -outfile LOG_DIR/jsvc.out.log   \
     -errfile LOG_DIR/jsvc.err.log   \
     -pidfile LOG_DIR/jsvc.pid  \
     -user jboss \
     -nodetach -D"[Process Controller]" -server -Xms64m \
     -Xmx512m -XX:MaxPermSize=256m \
     -Djava.net.preferIPv4Stack=true  \
     -Djboss.modules.system.pkgs=org.jboss.byteman \
     -Djava.awt.headless=true  \
     -Dorg.jboss.boot.log.file=LOG_DIR/process-controller.log \
     -Dlogging.configuration=file:CONF_DIR/logging.properties \
     -Djboss.modules.policy-permissions \
     -cp "EAP_HOME/jboss-modules.jar:JSVC_JAR" \
     org.apache.commons.daemon.support.DaemonWrapper \
     -start org.jboss.modules.Main -start-method main \
     -mp EAP_HOME/modules org.jboss.as.process-controller \
     -jboss-home EAP_HOME -jvm $JAVA_HOME/bin/java \
     -mp EAP_HOME/modules -- \
     -Dorg.jboss.boot.log.file=LOG_DIR/host-controller.log \
     -Dlogging.configuration=file:CONF_DIR/logging.properties \
     -Djboss.modules.policy-permissions \
     -server -Xms64m -Xmx512m -XX:MaxPermSize=256m \
     -Djava.net.preferIPv4Stack=true \
     -Djboss.modules.system.pkgs=org.jboss.byteman \
     -Djava.awt.headless=true -- -default-jvm $JAVA_HOME/bin/java

注意

如果 JBoss EAP 6 异常终止,如 JMV 崩溃,Jsvc 将自动重启它。如果 JBoss EAP 6 是正常终止的,Jsvc 也会随之停止。

第 9 章 全局 Valve

9.1. 关于 Valve

Valve 是一个 Java 类,它在 Servlet 过滤器之前插入到应用程序的请求处理管道里。Valve 可以在将请求传递或执行其他处理(如验证或取消请求)之前修改请求。
Valve 可以在服务器或应用程序级别进行配置。唯一的区别是如何配置和打包。
  • 全局 Valve 是在服务器级别配置的,它应用于所有部署在服务器里的应用程序。配置全局 Valve 的说明位于《JBoss EAP 管理和配置指南》里。
  • 在应用程序级别配置的 Valve 和应用程序部署打包在一起,它只影响专门的应用程序。配置程序级别的 Valve 的说明位于《JBoss EAP 开发指南》里。
6.1.0 和以后的版本支持全局 Valve。

9.2. 关于全局 Valve

全局 Valve 是插入到应用程序的请求处理管道里的 Valve。在 JBoss EAP 6 里 Valve 可以通过打包或安装为静态模块来成为全局 Valve。全局 Valve 是在 web 子系统里配置的。
只有 6.1.0 和以后的版本支持全局 Valve。
关于如何配置全局 Valve 的说明,请参考《JBoss EAP 管理和配置指南》里的 『全局 Valve』。章节。

9.3. 关于 Authenticator Valve

Authenticator Valve 是一个验证请求的凭证的 Valve。它是 org.apache.catalina.authenticator.AuthenticatorBase 的一个子类并重写了 authenticate(Request request, Response response, LoginConfig config) 方法。
它可以用于实现其他的验证模式。

9.4. 安装 Global Valve

全局 Valve 必须打包和安装为 JBoss EAP 6 里的静态模块。这个任务展示了如何安装模块。

预备条件:

  • Valve 必须已被创建且打包在 JAR 文件里。
  • 必须为这个模块创建一个 module.xml 文件。
    关于 module.xml 文件的例子,请参考 第 7.1.1 节 “模块”

过程 9.1. 安装全局模块(Global Module)

  1. 创建模块安装目录

    在应用服务器的 modules 目录里必须创建一个安装模块的目录。
    EAP_HOME/modules/system/layers/base/MODULENAME/main
    $ mkdir -P EAP_HOME/modules/system/layers/base/MODULENAME/main
  2. 复制文件

    复制 JAR 和 module.xml 文件到步骤 1 创建的目录里。
    $ cp MyValves.jar module.xml EAP_HOME/modules/system/layers/base/MODULENAME/main
模块里声明的 Valve 类现在可在 web 子系统里进行配置。

9.5. 配置全局 Valve

全局 Valve 可以在 web 子系统里启用和配置。这是用 JBoss CLI 工具来完成的。

过程 9.2. 配置全局 Valve

  1. 启用 Valve

    使用 add 操作添加新的 Valve 条目。
    /subsystem=web/valve=VALVENAME:add(module="MODULENAME",class-name="CLASSNAME")
    您需要指定下列值:
    • VALVENAME,用来引用应用程序配置里的 valve 的名称。
    • MODULENAME,包含要配置的 Valve 的模块。
    • CLASSNAME,模块里专有 valve 的类名。
    /subsystem=web/valve=clientlimiter:add(module="clientlimitermodule",class-name="org.jboss.samplevalves.RestrictedUserAgentsValve")
  2. 可选:指定参数

    如果 Valve 有配置参数,请用 add-param 操作进行指定。
    /subsystem=web/valve=testvalve:add-param(param-name="NAME", param-value="VALUE")
    /subsystem=web/valve=testvalve:add-param(
       param-name="restrictedUserAgents", 
       param-value="^.*MS Web Services Client Protocol.*$"
    )
Valve 已为所有部署的应用程序启用且配置好。

第 10 章 应用程序部署

10.1. 关于应用程序部署

JBoss EAP 6 带有一系列的应用程序部署和配置选项以满足管理和开发环境的需要。对于管理员而言,管理控制台和管理 CLI 提供了理想的图形化和命令行界面来管理产品环境里的应用程序部署。对于开发人员而言,应用程序部署测试选项包含了高度可配置的文件系统部署扫描器、对 IDE 如 JBoss Developer Studio 的使用及通过 Maven 进行部署和卸载。

10.2. 用管理控制台进行部署

10.2.1. 在管理控制台里管理应用程序的部署

通过管理控制台部署应用程序可为你提供易于使用的图形界面。你可以马上看到部署到服务器或组里的应用程序,而且你可以按照需要禁用或删除内容库里的应用程序。

10.2.2. 用管理控制台启用已部署的应用程序

过程 10.1. 用管理控制台启用已部署的应用程序

  1. 从控制台的顶部选择 Runtime 标签页。
    • 对于受管域,展开 Domain 菜单。
    • 对于独立服务器,展开 Server 菜单。
  2. 选择 Manage Deployments
  3. 应用程序的部署方法会根据部署到独立服务器还是受管域而有所不同。
    • 启用独立服务器实例里的应用程序

      Available Deployments 表显示所有可用的应用程序部署及其状态。
      1. 要启用独立服务器实例里的应用程序,请选择应用程序并点击 En/Disable
      2. 点击 confirm 按钮来确认应用程序将在服务器实例上启用。
    • 启用受管域里的应用程序

      Content Repository 标签页包含一个 Available Deployment Content 表显示所有可用的应用程序部署及其状态。
      1. 要启用受管域里的应用程序,请选择要部署的应用程序。点击 Available Deployment Content 表上的 Assign
      2. 选择您要添加应用程序的服务器组并点击 Save 按钮完成。
      3. 选择 Server Groups 标签页来查看 Server Groups 表。您的应用程序现在已部署到所选的服务器组了。
结果

应用程序部署在相关的服务器或服务器组。

10.2.3. 用管理控制台禁用已部署的应用程序

过程 10.2. 用管理控制台禁用已部署的应用程序

    1. 从控制台的顶部选择 Runtime 标签页。
      • 对于受管域,展开 Domain 菜单。
      • 对于独立服务器,展开 Server 菜单。
    2. 选择 Manage Deployments
  1. 禁用应用程序的方法会根据部署到独立服务器还是受管域而有所不同。
    • 禁用独立服务器实例里已部署的应用程序

      Available Deployments 表显示所有可用的应用程序部署及其状态。
      1. 选择要禁用的应用程序。点击 En/Disable 禁用所选的应用程序。
      2. 点击 confirm 按钮来确认应用程序将在服务器实例上禁用。
    • 禁用受管域里已部署的应用程序

      Manage Deployments Content 屏幕包含一个 Content Repository 标签页,Available Deployment Content 表显示所有可用的应用程序部署及其状态。
      1. 选择 Server Group 标签页来查看服务器组以及部署的应用程序的状态。
      2. 选择 Server Group 表里的服务器来卸载应用程序。点击 View 查看应用程序。
      3. 选择应用程序并点击 En/Disable 禁用所选服务器的应用程序。
      4. 点击 confirm 按钮来确认应用程序将在服务器实例上禁用。
      5. 按需要对其他服务器组重复这些步骤。Group Deployments 表里可以确认每个服务器组里的应用程序的状态。
结果

应用程序已从相关的服务器或服务器组里卸载。

10.3. 用管理 CLI 进行部署

10.3.1. 在管理 CLI 里管理应用程序的部署

通过管理 CLI 部署应用程序可让您用简单的命令行来创建和运行部署脚本。您可以使用脚本来配置专有的应用程序部署和管理场景。您既可以管理独立服务器实例里单个服务器的部署状态,也可以管理受管域里整个服务器网络。

10.3.2. 用管理 CLI 在独立服务器里部署应用程序

过程 10.3. 在独立服务器里部署应用程序

  • 运行 deploy 命令

    在管理 CLI 里,输入 deploy 命令及应用程序部署的位置。
    [standalone@localhost:9999 /] deploy /path/to/test-application.war
    请注意,成功的部署不会在 CLI 里产生任何输出。
结果

指定的应用程序已部署在独立服务器里了。

10.3.3. 用管理 CLI 卸载独立服务器里的应用程序

过程 10.4. 卸载独立服务器里的应用程序

  • 运行 undeploy 命令

    在管理 CLI 里,输入 undeploy 命令及应用程序部署的文件名。
    [standalone@localhost:9999 /] undeploy test-application.war
    请注意,成功的卸载不会在 CLI 里产生任何输出。
结果

指定的应用程序已经卸载了。

10.3.4. 用管理 CLI 在受管域里部署应用程序

过程 10.5. 在受管域里部署应用程序

  • 运行 deploy 命令

    在管理 CLI 里,输入 deploy 命令及应用程序部署的位置。如要部署到所有的服务器组,可以使用 --all-server-groups 参数。
    [domain@localhost:9999 /] deploy /path/to/test-application.war --all-server-groups
    • 或者,用 --server-groups 参数定义部署的专有服务器组。
      [domain@localhost:9999 /] deploy /path/to/test-application.war --server-groups=server_group_1,server_group_2
    请注意,成功的部署不会在 CLI 里产生任何输出。
结果

指定的应用程序现在已部署在受管域的服务器组里了。

10.3.5. 用管理 CLI 卸载受管域里的应用程序

过程 10.6. 卸载受管域里的应用程序

  • 运行 undeploy 命令

    在管理 CLI 里,输入 undeploy 命令及应用程序部署的文件名。如果要从应用程序原来部署过的所有服务器组里卸载这个应用程序,可以使用 --all-relevant-server-groups 参数。
    [domain@localhost:9999 /] undeploy test-application.war --all-relevant-server-groups
    请注意,成功的卸载不会在 CLI 里产生任何输出。
结果

指定的应用程序已经卸载了。

10.4. 用 HTTP API 进行部署

10.4.1. 用 HTTP API 部署应用程序

概述

应用程序可以按照下列说明通过 HTTP API 进行部署。

过程 10.7. 用 DeployDmrToJson.java 部署应用程序

  1. DeployDmrToJson.java 为 JSON 生成请求来部署应用程序。

    例 10.1. DeployDmrToJson.java class

    import org.jboss.dmr.ModelNode;
    import java.net.URL;
    
    public class DeployDmrToJson
    {
      public static void main(String[] args) throws Exception
      {
        if(args.length < 1)
          throw new IllegalArgumentException("The first argument must be a URL");
    
        URL url = new URL(args[0]);
        String[] pathElements = url.getFile().split("/");
        String name = pathElements[pathElements.length-1];
    
        ModelNode deploy = getDeploy(url.toExternalForm(), name);
        ModelNode undeploy = getUndeploy(name);
    
        System.out.println("Deploy\n------------------------------\n");
        System.out.println("Formatted:\n" + deploy.toJSONString(false));
        System.out.println("Unformatted:\n" + deploy.toJSONString(true));
        System.out.println("\nUneploy\n------------------------------\n");
        System.out.println("Formatted:\n" + undeploy.toJSONString(false));
        System.out.println("Unformatted:\n" + undeploy.toJSONString(true));
      }
    
      public static ModelNode getUndeploy(String name)
      {
        ModelNode undeployRequest = new ModelNode();
        undeployRequest.get("operation").set("undeploy");
        undeployRequest.get("address", "deployment").set(name);
    
        ModelNode removeRequest = new ModelNode();
        removeRequest.get("operation").set("remove");
        removeRequest.get("address", "deployment").set(name);
    
        ModelNode composite = new ModelNode();
        composite.get("operation").set("composite");
        composite.get("address").setEmptyList();
        final ModelNode steps = composite.get("steps");
        steps.add(undeployRequest);
        steps.add(removeRequest);
        return composite;
      }
    
      public static ModelNode getDeploy(String url, String name)
      {
        ModelNode deployRequest = new ModelNode();
        deployRequest.get("operation").set("deploy");
        deployRequest.get("address", "deployment").set(name);
    
        ModelNode addRequest = new ModelNode();
        addRequest.get("operation").set("add");
        addRequest.get("address", "deployment").set(name);
        addRequest.get("content").get(0).get("url").set(url);
    
        ModelNode composite = new ModelNode();
        composite.get("operation").set("composite");
        composite.get("address").setEmptyList();
        final ModelNode steps = composite.get("steps");
        steps.add(addRequest);
        steps.add(deployRequest);
        return composite;
      }
    }
    
  2. 按照下列说明用命令运行这个类:

    例 10.2. 执行命令

    java -cp .:$JBOSS_HOME/modules/org/jboss/dmr/main/jboss-dmr-1.1.1.Final-redhat-1.jar DeployDmrToJson \
    file:///Users/username/support/helloWorld.war/dist/helloWorld.war
    
  3. 当类运行时,下列命令格式将被显示。请根据要求使用 deployundeploy 命令。

    例 10.3. 

    Deploy
    ------------------------------
    
    Formatted:
    {
        "operation" : "composite",
        "address" : [],
        "steps" : [
            {
                "operation" : "add",
                "address" : {"deployment" : "helloWorld.war"},
                "content" : [{"url" : "file:/Users/username/support/helloWorld.war/dist/helloWorld.war"}]
            },
            {
                "operation" : "deploy",
                "address" : {"deployment" : "helloWorld.war"}
            }
        ]
    }
    Unformatted:
    {"operation" : "composite", "address" : [], "steps" : [{"operation" : "add", "address" : {"deployment" : "helloWorld.war"}, "content" : [{"url" : "file:/Users/username/support/helloWorld.war/dist/helloWorld.war"}]},{"operation" : "deploy", "address" : {"deployment" : "helloWorld.war"}}]}
    
    Uneploy
    ------------------------------
    
    Formatted:
    {
        "operation" : "composite",
        "address" : [],
        "steps" : [
            {
                "operation" : "undeploy",
                "address" : {"deployment" : "helloWorld.war"}
            },
            {
                "operation" : "remove",
                "address" : {"deployment" : "helloWorld.war"}
            }
        ]
    }
    Unformatted:
    {"operation" : "composite", "address" : [], "steps" : [{"operation" : "undeploy", "address" : {"deployment" : "helloWorld.war"}},{"operation" : "remove", "address" : {"deployment" : "helloWorld.war"}}]}
    
    
  4. 使用下列命令部署或卸载应用程序。请用上面概述的请求替换 json request

    例 10.4. 执行命令

    curl -f --digest -u "<user>:<pass>" -H Content-Type:\ application/json -d '<json request>' "http://localhost:9990/management"
    

10.5. 用部署扫描器进行部署

10.5.1. 在部署扫描器(Deployment Scanner)里管理应用程序的部署

通过部署扫描器将应用程序部署到独立服务器实例里允许你以适合快速开发周期的方式构建和测试应用程序。你可以配置部署扫描器以适合不同应用程序类型的部署频率和行为。

10.5.2. 用部署扫描器部署应用程序到独立服务器实例

概述

这个任务展示了用部署扫描器部署应用程序到独立服务器实例的方法。如 第 10.1 节 “关于应用程序部署” 所述,这个方法是为了方便开发人员而保留的,对于产品环境下的管理我们推荐管理控制台和管理 CLI 方法。

过程 10.8. 使用部署扫描器部署应用程序

  1. 复制内容到 deployment 目录

    复制应用程序文件到 EAP_HOME/standalone/deployments/ 里的 deployment 目录。
  2. 部署扫描模式

    有两种部署方法。您可以选择自动或手动部署扫描模式。在启动部署方法之前,请先阅读 第 10.5.8 节 “用管理 CLI 配置部署扫描器”
    • 自动扫描

      部署扫描器获取文件夹状态的变动并创建一个 第 10.5.8 节 “用管理 CLI 配置部署扫描器” 里定义的 marker 文件。
    • 手动部署

      部署扫描器需要一个 marker 文件来触发部署过程。下面的例子使用了 Unix touch 命令来创建一个新的 .dodeploy 文件。

      例 10.5. 用 touch 命令进行部署

      [user@host bin]$ touch $EAP_HOME/standalone/deployments/example.war.dodeploy
结果

应用程序文件部署到了应用服务器里。deployment 目录里创建了一个 marker 文件以表示部署成功,且应用程序在管理控制台里被标记为 Enabled

例 10.6. 在部署后 deployment 目录包含了下列内容

example.war
example.war.deployed

10.5.3. 用部署扫描器卸载独立服务器实例的应用程序

概述

这个任务展示了用部署扫描器卸载独立服务器实例的应用程序的方法。如 第 10.1 节 “关于应用程序部署” 所述,这个方法是为了方便开发人员而保留的,对于产品环境下的管理我们推荐管理控制台和管理 CLI 方法。

注意

部署扫描器不应该和其他用于应用程序管理的部署方法一起使用。通过管理控制台从应用服务器删除的应用程序将从 runtime 删除而不会影响 marker 文件及 deployment 目录里包含的应用程序。要最小化意外重部署或其他错误的风险,在产品环境里请使用管理 CLI 和管理控制台。

过程 10.9. 用下列方法之一卸载应用程序

  • 卸载应用程序

    有两种方法可以卸载应用程序,这取决于您是否想从 deployment 目录删除应用程序还是只修改它的部署状态。
    • 通过删除 marker 文件进行卸载

      删除已部署的应用程序的 example.war.deployed marker 文件来触发部署扫描器从 runtime 卸载应用程序。
      结果
      部署扫描器卸载应用程序并创建一个 example.war.undeployed marker 文件。应用程序仍保留在 deployment 目录里。
    • 通过删除应用程序进行卸载

      从 deployment 目录删除应用程序来触发部署扫描器从 runtime 卸载应用程序。
      结果
      部署扫描器卸载应用程序并创建一个 filename.filetype.undeployed marker 文件。应用程序现在不会出现在 deployment 目录里了。
结果

应用程序文件从应用服务器里卸载且不会出现在管理服务器的 Deployments 屏幕上了。

10.5.4. 用部署扫描器在独立服务器实例里重新部署应用程序

概述

这个任务展示了用部署扫描器重新部署应用程序到独立服务器实例的方法。如 第 10.1 节 “关于应用程序部署” 所述,这个方法是为了方便开发人员而保留的,对于产品环境下的管理我们推荐管理控制台和管理 CLI 方法。

过程 10.10. 在独立服务器里重新部署应用程序

  • 重新部署应用程序

    重新部署用部署扫描器部署的应用程序有三种可能的方法。这些方法可以触发部署扫描器来启动部署循环,您可以按个人喜好进行选择。
结果

应用程序被重新部署。

10.5.5. 对部署扫描器 Marker 文件的引用

Marker 文件

Marker 文件是部署扫描器子系统的一部分。这些文件标记独立服务器的 deployment 目录里的应用程序的状态。Marker 文件具有和应用程序相同的名称,其后缀则表示部署的状态。下表定义了每个 marker 文件的类型及响应。

例 10.8. Marker 文件示例

下面的例子展示了用于成功部署的 testapplication.war 应用程序的实例的 marker 文件。
testapplication.war.deployed

表 10.1. Marker 文件类型定义

文件名后缀 来源 描述
.dodeploy 用户生成 表示内容应该部署到 runtime 或从 runtime 卸载。
.skipdeploy 用户生成 禁用应用程序的自动部署。用作禁止展开内容的自动部署的临时方法,阻止不完整的内容进入应用环境。它可以用于压缩的内容,扫描器会检测压缩内容的进度并等待完成。
.isdeploying 系统生成 表示部署的初始化。当部署过程完成时,Marker 文件将被删除。
.deployed 系统生成 表示内容已经被部署。如果文件被删除,这些内容将被卸载。
.failed 系统生成 表示部署失败。Marker 文件包含关于失败原因的信息。如果 Marker 文件被删除,这些内容将再次对于自动部署可见。
.isundeploying 系统生成 表示对删除 .deployed 文件的响应。完成后其内容将被卸载且 marker 文件将被自动删除。
.undeployed 系统生成 表示内容已被卸载。Marker 文件的删除对内容重部署没有影响。
.pending 系统生成 表示部署说明将被发送到有检测的问题还未解决的服务器。这个 marker 文件充当全局部署 road-block。当这个条件存在时,扫描器不会指引服务器部署或卸载任何其他内容。

10.5.6. 对部署扫描器属性的引用

部署扫描器包含下列开放给管理 CLI 且可用 write-attribute 进行配置的属性。关于配置选项的更多信息,请参考 第 10.5.8 节 “用管理 CLI 配置部署扫描器”

表 10.2. 部署扫描器属性

实例类型 描述 类型 默认值
auto-deploy-exploded 允许自动部署展开内容而无需 .dodeploy marker 文件。我们仅推荐用于基本的部署场景,以防止在开发人员或操作系统进行修改时发生展开的应用程序的部署。 布尔值(Boolean) False
auto-deploy-xml 允许自动部署 XML 内容而无需 .dodeploy marker 文件。 布尔值(Boolean) True
auto-deploy-zipped 允许自动部署压缩内容而无需 .dodeploy marker 文件。 布尔值(Boolean) True
deployment-timeout 部署扫描器在取消部署前允许尝试部署的时间。 Long 600
path 定义要扫描的实际的文件系统路径。如果指定了 relative-to 属性,path 值将充当该目录或路径的相对路径。 字符串 deployments
relative-to 对在服务器配置 XML 文件的 paths 部分定义的文件系统路径的引用。 字符串 jboss.server.base.dir
scan-enabled 允许在启动时及每隔 scan-interval 自动扫描应用程序。 布尔值(Boolean) True
scan-interval 扫描资料库的时间间隔(毫秒)。小于 1 的值表示扫描器只有在启动时才操作。 Int 5000

10.5.7. 配置部署扫描器

我们可以用管理控制台或管理 CLI 配置部署扫描器。您可以创建一个新的部署扫描器或者管理现有的扫描器属性。这些包括扫描间隔、部署文件夹的位置、触发部署的应用程序文件类型。

10.5.8. 用管理 CLI 配置部署扫描器

概述

虽然有多个方法可以配置部署扫描器,管理 CLI 可以用批处理脚本或实时开放和修改属性。您可以用 read-attributewrite-attribute 全局命令行操作修改部署扫描器的行为。关于部署扫描器属性的更多信息,请参考 第 10.5.6 节 “对部署扫描器属性的引用”

部署扫描器是 JBoss EAP 6 的一个子系统,您可以在 standalone.xml 里查看它。
<subsystem xmlns="urn:jboss:domain:deployment-scanner:1.1">
    <deployment-scanner path="deployments" relative-to="jboss.server.base.dir" scan-interval="5000"/>
</subsystem>

过程 10.11. 配置部署扫描器

  1. 确定要配置的部署扫描器属性

    通过管理 CLI 配置部署描述符要求您首先开放正确的属性名。您可以在根节点上用 read-resources 操作来实现,或者用 cd 命令来修改子节点。您也可以用 ls 命令显示这个级别的属性。
    • read-resource 操作开放部署扫描器的属性

      请使用 read-resource 操作来开放默认部署扫描器资源定义的属性。
      [standalone@localhost:9999 /]/subsystem=deployment-scanner/scanner=default:read-resource
      {
          "outcome" => "success",
          "result" => {
              "auto-deploy-exploded" => false,
              "auto-deploy-xml" => true,
              "auto-deploy-zipped" => true,
              "deployment-timeout" => 600,
              "path" => "deployments",
              "relative-to" => "jboss.server.base.dir",
              "scan-enabled" => true,
              "scan-interval" => 5000
          }
      }
      
    • ls 命令开放部署扫描器属性

      请使用 ls 命令和 -l 可选参数来显示包含子系统节点、值和类型的结果。您可以输入ls --help 来学习关于 ls 命令及其参数的更多内容。关于管理 CLI 里帮助菜单的详情,请参考 第 3.5.5 节 “用管理 CLI 获取帮助”
      [standalone@localhost:9999 /] ls -l /subsystem=deployment-scanner/scanner=default
      ATTRIBUTE            VALUE                 TYPE    
      auto-deploy-exploded false                 BOOLEAN 
      auto-deploy-xml      true                  BOOLEAN 
      auto-deploy-zipped   true                  BOOLEAN 
      deployment-timeout   600                   LONG    
      path                 deployments           STRING  
      relative-to          jboss.server.base.dir STRING  
      scan-enabled         true                  BOOLEAN 
      scan-interval        5000                  INT
      
  2. write-attribute 操作配置部署扫描器

    在您确定了要修改的属性的名称后,请使用 write-attribute 来指定属性名称和写入的新值。下面的例子都运行在子节点级别,可以通过 cd 命令访问,并开放默认扫描器节点的 Tab 完成和修改。
    [standalone@localhost:9999 /] cd subsystem=deployment-scanner/scanner=default
    
    1. 启用展开内容的自动部署

      请使用 write-attribute 命令来禁用展开的 应用程序内容的自动部署。
      [standalone@localhost:9999 scanner=default] :write-attribute(name=auto-deploy-exploded,value=true)
      {"outcome" => "success"}
      
    2. 禁用 XML 内容的自动部署

      请使用 write-attribute 命令来禁用 XML 应用程序内容的自动部署。
      [standalone@localhost:9999 scanner=default] :write-attribute(name=auto-deploy-xml,value=false)     
      {"outcome" => "success"}
      
    3. 禁用压缩内容的自动部署

      请使用 write-attribute 命令来禁用压缩的应用程序内容的自动部署。
      [standalone@localhost:9999 scanner=default] :write-attribute(name=auto-deploy-zipped,value=false)
      {"outcome" => "success"}
      
    4. 配置路径属性

      请使用 write-attribute 操作来修改路径属性,用新的路径名替换 newpathname 以被部署扫描器监控。请注意,服务器需要重启以使修改生效。
      [standalone@localhost:9999 scanner=default] :write-attribute(name=path,value=newpathname)            
      {
          "outcome" => "success",
          "response-headers" => {
              "operation-requires-reload" => true,
              "process-state" => "reload-required"
          }
      }
      
    5. 配置相对路径属性

      请使用 write-attribute 操作来修改对 XML 配置文件里路径部分定义的文件路径的相对引用。请注意,服务器将需要重启以使修改生效。
      [standalone@localhost:9999 scanner=default] :write-attribute(name=relative-to,value=new.relative.dir)
      {
          "outcome" => "success",
          "response-headers" => {
              "operation-requires-reload" => true,
              "process-state" => "reload-required"
          }
      }
      
    6. 禁用部署扫描器

      请使用 write-attribute 命令并将 scan-enabled 设为 false 来禁用部署扫描器。
      [standalone@localhost:9999 scanner=default] :write-attribute(name=scan-enabled,value=false)        
      {"outcome" => "success"}
      
    7. 修改扫描间隔

      请使用 write-attribute 操作来修改扫描间隔(5000 到 10000 毫秒)。
      [standalone@localhost:9999 scanner=default] :write-attribute(name=scan-interval,value=10000)
      {"outcome" => "success"}
      
结果

您对配置的修改已保存到部署扫描器里。

10.6. 用 Maven 进行部署

10.6.1. 用 Maven 管理应用程序部署

通过 Maven 部署应用程序允许您将部署周期合并为现有部署工作流的一部分。

10.6.2. 用 Maven 部署应用程序

概述

本节展示了用 Maven 卸载应用程序的方法。下面的例子使用了 JBoss EAP 6 Quickstarts 里的 jboss-as-helloworld.war 应用程序。helloworld 项目包含了一个初始化了 jboss-as-maven-plugin 的 POM 文件。这个插件提供了在应用服务器里部署和卸载应用程序的简单操作。

过程 10.12. 用 Maven 部署应用程序

  1. 打开终端会话并进入包含 Quickstart 例程的目录里。

    例 10.9. 进入 helloworld 应用程序目录

    [localhost]$ cd /QUICKSTART_HOME/helloworld
    
  2. 运行 Maven deploy 命令来部署应用程序。如果应用程序已经运行,它将被重新部署。
    [localhost]$ mvn package jboss-as:deploy
  3. 查看结果。
    • 通过在终端窗口里查看操作日志可以确认部署。

      例 10.10. 通过 Maven 确认 Helloworld 应用程序

                              
      [INFO] ------------------------------------------------------------------------
      [INFO] BUILD SUCCESS
      [INFO] ------------------------------------------------------------------------
      [INFO] Total time: 32.629s
      [INFO] Finished at: Fri Mar 14 09:09:50 EDT 2014
      [INFO] Final Memory: 23M/204M
      [INFO] ------------------------------------------------------------------------
      
      
    • 部署在活动应用程序服务器实例的状态流里也可以确认。

      例 10.11. 通过应用服务器确认 Helloworld 应用程序

      09:09:49,167 INFO  [org.jboss.as.repository] (management-handler-thread - 1) JBAS014900: Content added at location /home/username/EAP_HOME/standalone/data/content/32/4b4ef9a4bbe7206d3674a89807203a2092fc70/content
      09:09:49,175 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-7) JBAS015876: Starting deployment of "jboss-helloworld.war" (runtime-name: "jboss-helloworld.war")
      09:09:49,563 INFO  [org.jboss.weld.deployer] (MSC service thread 1-8) JBAS016002: Processing weld deployment jboss-helloworld.war
      09:09:49,611 INFO  [org.jboss.weld.deployer] (MSC service thread 1-1) JBAS016005: Starting Services for CDI deployment: jboss-helloworld.war
      09:09:49,680 INFO  [org.jboss.weld.Version] (MSC service thread 1-1) WELD-000900 1.1.17 (redhat)
      09:09:49,705 INFO  [org.jboss.weld.deployer] (MSC service thread 1-2) JBAS016008: Starting weld service for deployment jboss-helloworld.war
      09:09:50,080 INFO  [org.jboss.web] (ServerService Thread Pool -- 55) JBAS018210: Register web context: /jboss-helloworld
      09:09:50,425 INFO  [org.jboss.as.server] (management-handler-thread - 1) JBAS018559: Deployed "jboss-helloworld.war" (runtime-name : "jboss-helloworld.war")
结果

应用程序已部署到应用服务器里。

10.6.3. 用 Maven 卸载应用程序

概述

本节展示了用 Maven 卸载应用程序的方法。下面的例子使用了 JBoss EAP 6 Quickstarts 里的 jboss-as-helloworld.war 应用程序。helloworld 项目包含了一个初始化了 jboss-as-maven-plugin 的 POM 文件。这个插件提供了在应用服务器里部署和卸载应用程序的简单操作。

过程 10.13. 用 Maven 卸载应用程序

  1. 打开终端会话并进入包含 Quickstart 例程的目录里。

    例 10.12. 进入 helloworld 应用程序目录

    [localhost]$ cd /QUICKSTART_HOME/helloworld
    
  2. 运行 Maven undeploy 命令来卸载应用程序。
    [localhost]$ mvn jboss-as:undeploy
  3. 查看结果。
    • 通过在终端窗口里查看操作日志可以确认卸载。

      例 10.13. 卸载 Helloworld 应用程序的通 Maven 确认信息

      [INFO] ------------------------------------------------------------------------
      [INFO] BUILD SUCCESSFUL
      [INFO] ------------------------------------------------------------------------
      [INFO] Total time: 1 second
      [INFO] Finished at: Mon Oct 10 17:33:02 EST 2011
      [INFO] Final Memory: 11M/212M
      [INFO] ------------------------------------------------------------------------
    • 卸载在活动应用程序服务器实例的状态流里也可以确认。

      例 10.14. 卸载 Helloworld 应用程序的应用服务器确认信息

      09:51:40,512 INFO  [org.jboss.web] (ServerService Thread Pool -- 69) JBAS018224: Unregister web context: /jboss-helloworld
      09:51:40,522 INFO  [org.jboss.weld.deployer] (MSC service thread 1-3) JBAS016009: Stopping weld service for deployment jboss-helloworld.war
      09:51:40,536 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-1) JBAS015877: Stopped deployment jboss-helloworld.war (runtime-name: jboss-helloworld.war) in 27ms
      09:51:40,621 INFO  [org.jboss.as.repository] (management-handler-thread - 10) JBAS014901: Content removed from location /home/username/EAP_HOME/jboss-eap-6.3/standalone/data/content/44/e1f3c55c84b777b0fc201d69451223c09c9da5/content
      09:51:40,621 INFO  [org.jboss.as.server] (management-handler-thread - 10) JBAS018558: Undeployed "jboss-helloworld.war" (runtime-name: "jboss-helloworld.war")
      
结果

从服务器服务器里卸载了应用程序。

10.7. 控制 JBoss EAP 6 里部署应用程序的顺序

JBoss EAP 6 提供了服务器启动时对部署顺序的细颗粒度控制。您可以启用多个 EAR 文件里的严格的部署顺序以及重启后的持久化顺序。

过程 10.14. 控制 JBoss EAP 6.0.X 里部署的顺序

  1. 创建在服务器启动/停止时按顺序部署和卸载应用程序的 CLI 脚本。
  2. CLI 也支持批模式,它允许您将命令和操作分组并作为一个原子单元执行。如果有一个命令或操作运行失败,该批模式里所有其他已成功执行的命令或操作将进行回滚。

过程 10.15. 控制 JBoss EAP 6.1.X 里部署的顺序

EAP 6.1.X 里有一个名为 Inter Deployment Dependencies 的新功能,它允许您在顶层部署间声明依赖关系。
  1. app.ear/META-INF 文件夹里创建一个 jboss-all.xml 文件(如果没有),这里的 app.ear 是依赖于另外一个之前部署的应用程序的归档。
  2. 如下所示,在这个文件里创建一个 jboss-deployment-dependencies 条目。请注意,在下面的列表里,framework.ear 是应该在 app.ear 之前部署的依赖关系应用程序归档。
    <jboss umlns="urn:jboss:1.0">
      <jboss-deployment-dependencies xmlns="urn:jboss:deployment-dependencies:1.0">
        <dependency name="framework.ear" />
      </jboss-deployment-dependencies>
    </jboss>
    

10.8. 部署描述符覆盖

EAP 6.1.x 里有一个新的功能,它允许您在运行时覆盖部署描述符、JAR、类、JSP 页面和其他文件。deployment overlay 代表了归档里的一个规则集文件,它必须被覆盖。它也提供到应该替代被覆盖文件的新文件的链接。如果在部署归档里没有出现被覆盖的文件,那它会被添加回部署里。

过程 10.16. 用管理 CLI 覆盖部署描述符

下面的步骤假设您已经有一个部署的应用程序 app.war,你想用 /home/user/web.xml 下的 web.xml 覆盖它的 WEB-INF/web.xml 文件。
  1. 添加一个部署重叠并添加内容。您可以以下列两种方式来进行:
    • 使用 DRM 树

      1. /deployment-overlay=myoverlay:add
      2. /deployment-overlay=myoverlay/content=WEB-INF\/web.xml:add(content={url=file:///home/user/web.xml})
        您可以用第二个语句添加更多的内容规则。
    • 使用 convenience 模式

      deployment-overlay add --name=myoverlay --content=WEB-INF/web.xml=/home/user/web.xml
  2. 链接这个重叠至部署归档。您可以以下列两种方式来进行:
    • 使用 DRM 树

      /deployment-overlay=myoverlay/deployment=app.war:add
    • 使用 convenience 模式

      deployment-overlay link --name=myoverlay --deployments=app.war
      你必须指定用逗号隔开的多个归档名称。
    请注意,部署归档并不需要存在于服务器上。您可以指定这个名称,但不将其链接到实际的部署。
  3. 重新部署应用程序

    /deployment=app.war:redeploy

第 11 章 保护 JBoss EAP 6

11.1. 关于安全子系统

安全(security)子系统通过 PicketBox 提供的安全服务为 Red Hat JBoss EAP 里的所有安全功能提供了基础结构。这个子系统使用了和当前请求关联的安全上下文向相关的容器开放验证管理者、授权管理者、审计管理者和映射管理者的功能。
在默认情况下,security 安全子系统是预配置好的,所以您很少需要修改其中的安全元素。唯一要修改的可能是是否使用 deep-copy-subject-mode。在多数情况下,管理员将专注于 security domains 的配置。
Deep Copy 模式

关于 Deep Copy 模式的细节,请参考 第 11.4 节 “关于 Deep Copy Subject 模式”

安全域

安全域(Security Domain)是一系列 Java 验证和授权服务(Java Authentication and Authorization Service,JAAS)的声明式安全配置,一个或多个应用程序用它来控制验证、授权、审计和映射。有三个默认的安全域:jboss-ejb-policyjboss-web-policyother。你也可以按照应用程序的需要创建安全域。关于安全域的细节,请参考 第 11.6.12 节 “在应用程序里使用安全域”

11.2. 关于安全子系统的结构

安全子系统是在受管域或独立服务器的配置文件里配置的。多数配置元素可以用基于 web 的管理控制台或基于控制台的管理 CLI 来配置。下面是一个安全子系统配置的 XML 片段。

例 11.1. 安全子系统配置示例

<subsystem xmlns="urn:jboss:domain:security:1.2">
	<security-management>
		...
	</security-management>
	<security-domains>
        <security-domain name="other" cache-type="default">
            <authentication>
                <login-module code="Remoting" flag="optional">
                    <module-option name="password-stacking" value="useFirstPass"/>
                </login-module>
                <login-module code="RealmUsersRoles" flag="required">
                    <module-option name="usersProperties" value="${jboss.domain.config.dir}/application-users.properties"/>
                    <module-option name="rolesProperties" value="${jboss.domain.config.dir}/application-roles.properties"/>
                    <module-option name="realm" value="ApplicationRealm"/>
                    <module-option name="password-stacking" value="useFirstPass"/>
                </login-module>
            </authentication>
        </security-domain>
        <security-domain name="jboss-web-policy" cache-type="default">
            <authorization>
                <policy-module code="Delegating" flag="required"/>
            </authorization>
        </security-domain>
        <security-domain name="jboss-ejb-policy" cache-type="default">
            <authorization>
                <policy-module code="Delegating" flag="required"/>
            </authorization>
        </security-domain>
    </security-domains>
    <vault>
    	...
    </vault>
</subsystem>		
		

<security-management><subject-factory><security-properties> 元素没有出现在默认配置里。从 JBoss EAP 6.1 开始已启用了 <subject-factory><security-properties> 元素。

11.3. 配置安全子系统

你可以用管理 CLI 或基于 web 的管理控制台来配置安全子系统。
安全子系统里的每个顶级元素都包含关于安全配置不同方面的信息。关于安全子系统配置的例子,请参考 第 11.2 节 “关于安全子系统的结构”
<security-management>
这部分内容覆盖了安全子系统的高层行为。每个设置都是可选的。除了 Deep Copy 模式,须该这些设置的任何一个都是不寻常的。
选项 描述
deep-copy-subject-mode
指定是否复制或链接安全令牌以用于额外的线程安全。
authentication-manager-class-name
指定一个要使用的其他的 AuthenticationManager 实现的类名。
authorization-manager-class-name
指定一个要使用的其他的 AuthorizationManager 实现的类名。
audit-manager-class-name
指定一个要使用的其他的 AuditManager 实现的类名。
identity-trust-manager-class-name
指定一个要使用的其他的 IdentityTrustManager 实现的类名。
mapping-manager-class-name
指定一个要使用的 MappingManager 实现的类名。
<subject-factory>
主题工厂(Subject factory)控制主题实例的创建。它可以使用验证管理者来检验调用者。主题工厂的主要用途是为了 JCA 组件建立主题。你通常不需要修改它。
<security-domains>
保存多个安全域的容器元素。安全域可能包含关于验证、授权、映射、审计模块以及 JASPI 验证和 JSSE 配置的信息。你的应用程序可以指定一个安全域来管理它的安全信息。
<security-properties>
包含在 java.security.Security 类上设置的属性的名字和值。

11.4. 关于 Deep Copy Subject 模式

如果 Deep Copy 主题模式被禁用(默认),复制安全数据结构会产生一个对原始结构的引用,而不是复制整个数据结构。这个行为效率更高,但在具有相同标识符的多个线程通过冲刷或登出操作清除主题时容易受数据损坏的影响。
只要被标记为可克隆的(cloneable),Deep Copy 主题模式会导致数据结构及相关数据的完整复制。这是更多线程安全的,但效率更低。
Deep Copy Subject 模式是作为安全子系统的一部分来配置的。

11.5. 启用 Deep Copy Subject 模式

你可以通过基于 Web 的管理控制台或管理 CLI 来启用 Deep Copy 安全模式。

过程 11.1. 通过管理控制台启用 Deep Copy 安全模式

  1. 登录到管理控制台。

  2. 受管域:选择合适的配置集。

    在受管域里,安全子系统是针对每个配置集进行配置的,而且你可以在每个配置集里独立地启用或禁用 Deep Copy 安全模式。
    要选择配置集,请点击控制台顶部的 Configuration 标签,然后在左上角的 Profile 下拉菜单里选择配置集。
  3. 打开 Security Subsystem 配置菜单。

    展开 Security 菜单,然后选择 Security Subsystem
  4. 启用 Deep Copy Subject 模式。

    点击 Edit 按钮。选定 Deep Copy Subjects 复选框来启用 Deep Copy Subject 模式。
使用管理 CLI 启用 Deep Copy Subject 模式

如果你想通过管理 CLI 来启用这个选项,请使用下列命令。

例 11.2. 受管域

/profile=full/subsystem=security/:write-attribute(name=deep-copy-subject-mode,value=TRUE)

例 11.3. 独立服务器

/subsystem=security/:write-attribute(name=deep-copy-subject-mode,value=TRUE)

11.6. 安全域

11.6.1. 关于安全域

安全域是 JBoss EAP 6 安全子系统的一部分。所有的安全配置现在都由受管域的域控制器或独立服务器来集中管理了。
安全域由验证、授权、安全映射和审计的配置组成。它实现了 Java 验证和授权服务(Java Authentication and Authorization Service,JAAS) 声明式安全性。
验证指的是检验用户的身份。按照安全性术语,这个用户被称为 principal。虽然验证的授权是不同的,系统包含的许多验证模块也可以处理授权。
授权(Authorization)是一个服务器确定已验证的用户是否具有访问系统或操作里某些权利或资源的权限的过程。
安全映射(Security mapping)指的是将信息传递给应用程序之前在 principal、角色或属性里添加、修改、删除信息的能力。。
审计管理者允许你配置提供者模块(provider modules)来控制报告安全事件的方式。
如果你使用安全域,你可以从应用程序删除所有的专有安全配置。这允许你集中地修改安全参数。受益于这种配置结构的一个常见场景是在测试和产品环境间移动应用程序。

11.6.2. 关于 Picketbox

Picketbox 是基础的安全框架,它为运行在 JBoss EAP 6 里的 Java 应用程序提供了验证、授权、审计和映射能力。它用单一的配置在单一的框架里提供了这些能力:

11.6.3. 关于验证

验证指的是确定一个主题并检验标识的真实性。最常见的验证机制是用户名和密码的组合。其他常见的机制使用共享密钥、智能卡或指纹。按照 Java EE 的声明安全性,成功验证的结果被称为 principal。
JBoss EAP 6 使用一个可插拔的验证模块系统,它提供灵活性以及与机构里已使用的验证系统的集成性。每个安全域都包含一个或多个配置好的验证模块。每个模块都包含其他的配置参数来自定义其行为。配置验证子系统的最简单的方法是通过基于 web 的管理控制台。
验证和授权不同,虽然他们经常联系在一起。许多包含的验证模块也可以处理授权。

11.6.4. 配置安全域的验证

要配置安全域的验证,请登录到管理控制台并遵循下列步骤。

过程 11.2. 为安全域设置验证

  1. 打开安全域的详细视图。

    1. 点击管理控制台顶部的 Configuration 标签。
    2. 从 Profile 视图左上角的 Profile 里选择要修改的配置集。
    3. 展开 Security 菜单,然后选择 Security Domains
    4. 点击您要编辑的安全域的 View 链接。
  2. 进入验证子系统配置。

    如果还未选择的话,选择视图顶部的 Authentication 标签。
    配置区域分成两部分:Login ModulesDetails。登录模块是配置的基本单元。安全域可以包含多个登录模块,每个都包括几个属性和选项。
  3. 添加一个验证模块。

    点击 Add 添加一个 JAAS 验证模块。填写模块的细节。
    Code 是模块的类名。Flag 设置控制模块如何和相同安全域里的其他验证模块关联。
    对标签的解释

    Java EE 6 规格提供了安全域的标签的解释。下面的列表来自 http://docs.oracle.com/javase/6/docs/technotes/guides/security/jaas/JAASRefGuide.html#AppendixA。关于更消息的信息,请参考这个文档。

    标签 详情
    required
    登录模块是验证成功所必需的。如果成功或失败,验证都仍会继续处理登录模块列表。
    requisite
    登录模块是验证成功所必需的。如果成功,验证将继续处理登录模块列表。如果失败,控制权马上返回给应用程序(验证不会继续处理登录模块列表)。
    sufficient
    登录模块不是验证成功所必需的。如果成功,控制权马上返回给应用程序(验证不会继续处理登录模块列表)。如果失败,验证将继续处理登录模块列表。
    optional
    登录模块不是验证成功所必需的。如果成功或失败,验证都仍会继续处理登录模块列表。
  4. 编辑验证设置

    在你添加了模块时,你可以通过屏幕上的 Details 里的 Edit 按钮修改它的 CodeFlags。请确保选择了 Attributes 标签页。
  5. 可选的:添加或删除模块选项。

    如果你需要在模块里添加选项,请点击 Login Modules 列表里的条目,并在 Details 页面里选择 Module Options 标签页。点击 Add 按钮,并提供这个选项的键和值。你可以用 Remove 按钮来删除选项。
结果

你的验证模块已添加至安全域,且马上可为使用安全域的应用程序所用。

jboss.security.security_domain 模块选项

在默认情况下,安全域里定义的每个登录模块都会自动添加一个 jboss.security.security_domain 模块选项。这个选项会给检查是否只定义了已知选项的登录模块带来问题。IBM Kerberos 登录模块 com.ibm.security.auth.module.Krb5LoginModule 就是其中之一。

你可以通过在启动 JBoss EAP 时设置系统属性为 true 来禁用添加这个模块选项的行为。请添加下列内容到你的启动参数里。
-Djboss.security.disable.secdomain.option=true
你也可以用基于 web 的管理控制台来设置这个属性。在独立服务器里,你可以在配置文件的 Profile 部分来设置系统属性。在受管域里,你可以对每个服务器组设置系统属性。

11.6.5. 关于授权

授权是一个基于身份来赋予或拒绝对资源访问的机制。它作为一系列可以赋予 principal 的声明式安全角色来实现。
JBoss EAP 使用一个模块化系统来配置授权。每个安全域都可以获得一个或多个授权策略。每个策略都有一个定义自身行为的基本模块。它也可以通过特定的标记和属性来配置。配置授权子系统的最简单的方法是使用基于 web 的管理控制台。
授权不同于验证,它通常在验证之后发生。很多验证模块也可以处理授权。

11.6.6. 配置安全域里的授权

要配置安全域的授权,请登录到管理控制台并遵循下列步骤。

过程 11.3. 在安全域里设置授权

  1. 打开安全域的详细视图。

    1. 点击管理控制台顶部的 Configuration 标签。
    2. 在受管域里,从左上角的 Profile 下拉菜单里选择要修改的配置集。
    3. 展开 Security 菜单,然后选择 Security Domains
    4. 点击您要编辑的安全域的 View 链接。
  2. 进入授权子系统配置。

    从屏幕顶部选择 Authorization 标签。
    配置区域分成两部分:PoliciesDetails。登录模块是配置的基本单元。安全域可以包含几个授权策略,每个都包括几个属性和选项。
  3. 添加策略

    点击 Add 添加一个 JAAS 授权策略模块。填写模块的细节。
    Code 是模块的类名。Flag 控制模块如何和相同安全域里的其他授权策略模块关联。
    对标签的解释

    Java EE 6 规格提供了安全域的标签的解释。下面的列表来自 http://docs.oracle.com/javase/6/docs/technotes/guides/security/jaas/JAASRefGuide.html#AppendixA。关于更消息的信息,请参考这个文档。

    标签 详情
    required
    登录模块是授权成功所必需的。如果成功或失败,授权都仍会继续处理登录模块列表。
    requisite
    登录模块是授权成功所必需的。如果成功,授权将继续处理登录模块列表。如果失败,控制权马上返回给应用程序(授权不会继续处理登录模块列表)。
    sufficient
    登录模块不是授权成功所必需的。如果成功,控制权马上返回给应用程序(授权不会继续处理登录模块列表)。如果失败,授权将继续处理登录模块列表。
    optional
    登录模块不是授权成功所必需的。如果成功或失败,授权都仍会继续处理登录模块列表。
  4. 编辑授权设置

    在你添加了模块时,你可以通过屏幕上的 Details 里的 Edit 按钮修改它的 CodeFlags。请确保选择了 Attributes 标签页。
  5. 可选的:添加或删除模块选项。

    如果你需要在模块里添加选项,请点击 Policies 列表里的条目,并在 Details 页面里选择 Module Options 标签页。点击 Add 按钮,并提供这个选项的键和值。你可以用 Remove 按钮来删除选项。
结果

你的授权模块已添加至安全域,且马上可为使用安全域的应用程序所用。

11.6.7. 关于安全性审计

安全性审计包括触发事件,如在响应安全子系统里发生的事件而写入日志。审计机制和验证、授权、安全性映射细节都是作为安全域的一部分来配置的。
审计使用提供者模块。你可以使用内含的模块,或者实现自己的模块。

11.6.8. 配置安全审计

要配置安全域的安全审计,请登录到管理控制台并遵循下列步骤。

过程 11.4. 在安全域里设置安全审计

  1. 打开安全域的详细视图。

    1. 点击屏幕顶部的 Configuration
    2. 在受管域里,从左上角的 Profile 选择框里选择要修改的配置集。
    3. 展开 Security 菜单,然后选择 Security Domains
    4. 点击您要编辑的安全域的 View 链接。
  2. 进入审计子系统配置。

    从屏幕顶部选择 Audit 标签页。
    配置区域分成两部分:Provider ModulesDetails。提供者模块(Provider Module)是配置的基本单元。安全域可以包含多个提供者模块,每个都包括几个属性和选项。
  3. 添加一个提供者模块。

    点击 Add。 在 Code 里输入提供者模块的类名。
  4. 检验你的模块是否可以运行

    审计模块的目的是提供一个在安全子系统里监控事件的途径。这种监控可以通过写入日志文件、电子邮件通知或其他可度量的审计机制来实现。
    例如,JBoss EAP 6 默认包含了 LogAuditProvider 模块。如果按照上面的步骤启用,这个审计模块会将安全通知写入 EAP_HOME 目录里的 log 子目录下的 audit.log 文件里。
    要检验上面的步骤是否可以在 LogAuditProvider 上下文里运行,你可以执行一个可能触发通知的动作并检查审计日志文件。
    关于安全审计提供者模块的完整列表,请参考 第 12.4 节 “包括的安全审计供应商模块”
  5. 可选的:添加、编辑或删除模块选项。

    如果你需要在模块里添加选项,请点击 Modules 列表里的条目,并在 Details 页面里选择 Module Options 标签页。点击 Add 按钮,并提供这个选项的键和值。
    要编辑已存在的选项,请点击 Remove 删除它,然后点击 Add 再次以正确的选项添加它。
结果

你的安全审计模块已添加至安全域,且马上可为使用安全域的应用程序所用。

11.6.9. 关于审计日志

如果启用了 LogAuditProvider 模块,JBoss EAP 6 将维护一个审计日志,它记录应用程序和登录模块里的验证和授权。这个文件默认名为 audit.log 且位于 EAP_HOMElog 子目录里。这个行为是由日志子系统的日志处理程序确定的。此外,LogAuditProvider 模块的输出可以通过 syslog 日志处理程序发送到 syslog 服务器而不是某个文件。
在默认情况下,LogAuditProvider 模块只输出到累积的 audit.log 文件里。要实现定期的轮询文件处理程序 AUDIT,请使用下列管理 CLI 命令。
/subsystem=logging/periodic-rotating-file-handler=AUDIT/:add(suffix=.yyyy-MM-dd,formatter=%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n,level=TRACE,file={"relative-to" => "jboss.server.log.dir","path" => "audit.log"})

11.6.10. 关于安全性映射

安全性映射允许你在验证或授权发生后但在信息传递给应用程序之前合并验证和授权信息。其中一个例子是使用用于验证的 X509 证书,然后从证书转换 principal 为你的应用程序可以显示的逻辑名称。
你可以映射 principal(验证)、角色(授权)或凭证(非 principal 或角色的属性)。
角色映射用于在验证后对主题添加、替换或删除角色。
Principal 映射用于在验证后修改 principal。
属性映射用来从外部系统转换属性以供应用程序使用,反之亦然。

11.6.11. 在安全域里配置安全映射

要配置安全域的安全映射,请登录到管理控制台并遵循下列步骤。

过程 11.5. 在安全域里设置安全映射

  1. 打开安全域的详细视图。

    1. 点击管理控制台顶部的 Configuration 标签。
    2. 在受管域里,从左上角的 Profile 选择框里选择配置集。
    3. 展开 Security 菜单,然后选择 Security Domains
    4. 点击您要编辑的安全域的 View 链接。
  2. 进入映射子系统配置。

    从屏幕顶部选择 Mapping 标签。
    配置区域分成两部分:ModulesDetails。映射模块是配置的基本单元。安全域可以包含多个映射模块,每个都包括几个属性和选项。
  3. 添加安全映射模块。

    点击 Add
    输入模块的相关内容。Code 是模块的类名。Type 字段表示这个模块执行的映射的类型。所允许的值有 principal、role、attribute 和 credential。
  4. 编辑安全映射模块

    在你添加了模块时,你可以修改它的 CodeType
    1. 选择 Attributes 标签页。
    2. 点击屏幕的 Details 部分里的 Edit 按钮。
  5. 可选的:添加、编辑或删除模块选项。

    如果你需要在模块里添加选项,请点击 Modules 列表里的条目,并在 Details 页面里选择 Module Options 标签页。点击 Add 按钮,并提供这个选项的键和值。
    要编辑已存在的选项,请先点击 Remove 删除它,然后用新的值再次添加它。
    使用 Remove 按钮来删除选项。
结果

你的安全映射模块已添加至安全域,且马上可为使用安全域的应用程序所用。

11.6.12. 在应用程序里使用安全域

介绍

要在应用程序里使用安全域,首先您必须在服务器配置文件里定义安全域并在应用程序的描述符文件里启用安全域。然后您必须添加所需的注解到使用安全域的 EJB。本节涵盖了在应用程序里使用安全域所需的步骤。

警告

如果应用程序不是使用验证缓存的安全域的一部分,用于该应用程序的用户验证将也可用于安全域里的其他应用程序。

过程 11.6. 配置你的应用程序以使用安全域

  1. 定义安全域

    您需要在服务器的配置文件里定义安全域,然后在应用程序的描述符文件里启用它。
    1. 在服务器的配置文件里配置安全域

      安全域是在服务器配置文件的 security 子系统里配置的。如果 JBoss EAP 6 实例运行在受管域里,配置文件应该是 domain/configuration/domain.xml。如果是独立服务器,则是 standalone/configuration/standalone.xml 文件。
      otherjboss-web-policyjboss-ejb-policy 都是 JBoss EAP 6 里默认提供的安全域。下面的 XML 示例是从服务器配置文件的 security 子系统里复制的。
      为执行更快的验证检查,安全域的 cach-type 属性指定了一个缓存。允许的值由用于简单表缓存的 default 或 Infinispan 缓存的 infinispan
      <subsystem xmlns="urn:jboss:domain:security:1.2">
          <security-domains>
              <security-domain name="other" cache-type="default">
                  <authentication>
                      <login-module code="Remoting" flag="optional">
                          <module-option name="password-stacking" value="useFirstPass"/>
                      </login-module>
                      <login-module code="RealmDirect" flag="required">
                          <module-option name="password-stacking" value="useFirstPass"/>
                      </login-module>
                  </authentication>
              </security-domain>
              <security-domain name="jboss-web-policy" cache-type="default">
                  <authorization>
                      <policy-module code="Delegating" flag="required"/>
                  </authorization>
              </security-domain>
              <security-domain name="jboss-ejb-policy" cache-type="default">
                  <authorization>
                      <policy-module code="Delegating" flag="required"/>
                  </authorization>
              </security-domain>
          </security-domains>
      </subsystem>
      
      你可以按需要用管理控制台或 CLI 配置其他的安全域。
    2. 在应用程序的描述符文件里启用安全域

      安全域是在应用程序的 WEB-INF/jboss-web.xml 文件里的 <jboss-web> 元素的<security-domain> 子元素里指定的。下面的例子配置了一个名为 my-domain 的安全域。
      <jboss-web>
          <security-domain>my-domain</security-domain>
      </jboss-web>
      
      这只是你可以在 WEB-INF/jboss-web.xml 描述符里指定的许多设置中的一个。
  2. 在 EJB 里添加必需的注解

    你可以用 @SecurityDomain@RolesAllowed 注解在 EJB 里配置安全性。下面的 EJB 代码示例限制了具有 guest 角色的用户对 other 安全域的访问。
    package example.ejb3;
    
    import java.security.Principal;
    
    import javax.annotation.Resource;
    import javax.annotation.security.RolesAllowed;
    import javax.ejb.SessionContext;
    import javax.ejb.Stateless;
    
    import org.jboss.ejb3.annotation.SecurityDomain;
    
    /**
     * Simple secured EJB using EJB security annotations
     * Allow access to "other" security domain by users in a "guest" role.
     */
    @Stateless
    @RolesAllowed({ "guest" })
    @SecurityDomain("other")
    public class SecuredEJB {
    
       // Inject the Session Context
       @Resource
       private SessionContext ctx;
    
       /**
        * Secured EJB method using security annotations
        */
       public String getSecurityInfo() {
          // Session context injected using the resource annotation
          Principal principal = ctx.getCallerPrincipal();
          return principal.toString();
       }
    }
    关于更多的代码示例,请参考 JBoss EAP 6 Quickstarts 集里的 ejb-security quickstart,你可以在红帽的客户门户找到这些例子。

11.6.13. Java 容器授权合约(JACC)

11.6.13.1. 关于 Java 容器授权合约(JACC)

Java 容器授权合约(Java Authorization Contract for Containers,JACC)是一个定义容器和授权服务提供者之间合约的标准,它规范容器使用的提供者实现。它是由 JSR-115 定义的,你可以在 Java Community Process 网站上找到相关信息:http://jcp.org/en/jsr/detail?id=115。从 Java EE 1.3 以后,它已经是核心 Java EE 规格的一部分了。
JBoss EAP 通过安全子系统的安全性功能实现了对 JACC 的支持。

11.6.13.2. 配置 Java 容器授权合约(JACC)的安全性

要配置 JACC,你需要用正确的模块配置你的安全域,然后修改 jboss-web.xml 来包含正确的参数。
为安全域添加 JACC 支持