2.4. 正常暂停和关闭 JBoss EAP

JBoss EAP 可以被暂停或正常关闭。这允许活动请求正常完成,而不接受任何新请求。超时值指定暂停或关机操作将等待活跃请求完成的时间。服务器暂停时,仍然处理管理请求。

安全关闭在服务器范围内协调,主要关注请求进入服务器的入口点。以下子系统支持安全关闭:

Undertow
undertow 子系统将等待所有请求完成。
mod_cluster
modcluster 子系统将通知负载平衡器,服务器正在 PRE_SUSPEND 阶段暂停。
ejb3
ejb3 子系统将等待所有远程 Jakarta Enterprise Beans 请求和 MDB 消息发送完成。在 PRE_SUSPEND 阶段停止发送到 MDB。Jakarta Enterprise Beans 计时器已被暂停,服务器恢复时将激活错过的计时器。
事务

暂停后,服务器将不会接受新请求,但内点事务和请求可以继续,直到它们完成或超时后过期。这也适用于与 XTS 事务关联的 Web 服务请求。

注意

默认情况下,对于 ejb 子系统禁用事务安全关闭。如果您希望服务器在暂停前等待 Jakarta Enterprise Beans 相关的事务完成,则必须启用事务正常关闭。例如:

/subsystem=ejb3:write-attribute(name=enable-graceful-txn-shutdown,value=true)
Jakarta Concurrency

服务器将等待所有活动任务完成。将跳过所有排队的作业。目前,由于 Jakarta Concurrency 没有持久性,被跳过的排队作业将丢失。

服务器处于暂停状态时,计划的任务将继续在计划的时间执行,但会抛出 java.lang.IllegalStateException。服务器恢复后,计划的任务将继续正常执行,而且在大多数情况下,不需要重新排期任务。

batch
服务器将在超时时间内停止所有运行的作业,并延迟所有计划的作业。
注意

目前,正常关机将不会拒绝新的入站 Jakarta 消息。Jakarta Batch 作业和由 in-light 活动调度的 Jakarta Concurrency 任务目前被允许继续;但 Jakarta Concurrency 任务提交,该任务在执行时传递超时窗口当前错误。

请求由 request-controller 子系统跟踪。如果没有这个子系统,挂起和恢复功能会非常有限,服务器不会在暂停或关闭前等待请求完成;但是,如果您不需要此功能,可以删除 request-controller 子系统来小的性能提升。

2.4.1. 挂起服务器

JBoss EAP 7 引入了 暂停 模式,可正常暂停服务器操作。这允许所有活动的请求正常完成,但不接受任何新请求。服务器暂停后,可以关机,返回到运行中状态,或保持暂停状态以执行维护。

注意

暂停服务器不会影响到管理接口。

可以使用管理控制台或管理 CLI 暂停和恢复服务器。

检查 Server Suspend 状态

可以通过下列管理 CLI 命令查看服务器暂停状态:生成的值为 RUNNINGPRE_SUSPEND、SUSPEND ING 或 SUS PENDED 之一。

  • 检查单机服务器的暂停状态。

    :read-attribute(name=suspend-state)
  • 检查受管域中服务器的暂停状态。

    /host=master/server=server-one:read-attribute(name=suspend-state)
suspend

使用以下管理 CLI 命令,通过指定超时值(以秒为单位)暂停服务器,以便服务器等待活动请求完成:默认值为 0,它会立即暂停。值为 -1 将导致服务器无限期等待所有活动的请求完成。

每个示例最多等待 60 秒以请求完成,然后再暂停。

  • 暂停单机服务器.

    :suspend(suspend-timeout=60)
  • 暂停受管域中的所有服务器。

    :suspend-servers(suspend-timeout=60)
  • 在受管域中暂停一台服务器。

    /host=master/server-config=server-one:suspend(suspend-timeout=60)
  • 暂停服务器组中的所有服务器。

    /server-group=main-server-group:suspend-servers(suspend-timeout=60)
  • 在主机级别暂停所有服务器。

    /host=master:suspend-servers(suspend-timeout=60)
恢复

restore 命令将服务器返回到正常运行状态,以接受新请求。您可以在主机、服务器、服务器组或域级别启动 命令。例如:

:resume
在 Suspended State 中启动 Server

您可以启动处于暂停状态的服务器,以便在服务器恢复之前不会接受任何请求。

  • 若要以暂停状态启动单机服务器,可在启动 JBoss EAP 实例时使用 --start-mode=suspend 运行时参数。

    $ EAP_HOME/bin/standalone.sh --start-mode=suspend
  • 若要启动处于暂停状态的受管域服务器,可将 start-mode=suspend 参数传递到管理 CLI 命令中的 启动 操作。

    /host=HOST_NAME/server-config=SERVER_NAME:start(start-mode=suspend)
    注意

    您还可以将 start-mode 参数传递到服务器的 重新加载重新启动 操作。

  • 若要启动受管域服务器组中处于暂停状态的所有服务器,可将 start-mode=suspend 参数传递到管理 CLI 命令中的 start-servers 操作:

    /server-group=SERVER_GROUP_NAME:start-servers(start-mode=suspend)
    注意

    您还可以将 start-mode 参数传递到 reload-serversrestart-servers 操作,供服务器组使用。

2.4.2. 使用管理 CLI 正常关闭服务器

如果在停止服务器时指定了适当的超时值,则会安全地关闭服务器。发出 命令后,服务器将被暂停,并将等待所有请求的指定超时完成,然后再关机。

使用以下管理 CLI 命令,安全地关闭服务器:指定服务器的超时值(以秒为单位),以便服务器等待活跃请求完成。默认值为 0,它将立即关闭服务器。值为 -1 将导致服务器无限期等待所有活动的请求完成,然后再关机。

每个示例最多等待 60 秒以请求完成,然后关机。

  • 正常关闭单机服务器。

    shutdown --suspend-timeout=60
  • 正常停止受管域中的所有服务器。

    :stop-servers(suspend-timeout=60)
  • 正常停止受管域中的一台服务器。

    /host=master/server-config=server-one:stop(suspend-timeout=60)
  • 正常停止服务器组中的所有服务器。

    /server-group=main-server-group:stop-servers(suspend-timeout=60)
  • 关闭主机控制器及其管理的所有服务器。

    /host=master:shutdown(suspend-timeout=60)
    注意

    suspend-timeout 属性仅应用到主机控制器管理的服务器,而不应用到主机控制器本身。

2.4.3. 使用 OS 信号正常关闭服务器

可以通过发送 OS TERM 信号 (如 kill -15 PID )来安全地关闭服务器。默认情况下,这个值与管理 CLI 的 shutdown --suspend-timeout=0 命令相同,从而导致任何当前处理请求立即终止。超时可以通过 org.wildfly.sigterm.suspend.timeout 系统属性进行配置,这表示服务器关闭之前等待请求完成的最大秒数。值 -1 表示服务器将无限期等待。

重要

在受管域中,不应使用 OS 信号来关闭服务器。取而代之,应当 使用管理 CLI 和管理主机控制器来关闭 服务器。

如果使用 OS 信号正常关机,如果 JVM 配置为禁用信号处理,例如 -Xrs java 参数已传递到 JVM 选项,或者发送的信号不是进程可以响应的信号,例如发送 KILL 信号 时,则不会起作用。