2.4. JBoss EAP の正常な一時停止およびシャットダウン

JBoss EAP は正常に一時停止およびシャットダウンできます。これにより、新しいリクエストを許可せずにアクティブなリクエストを正常に完了できます。タイムアウト値は、一時停止またはシャットダウン操作がアクティブなリクエストの完了まで待つ期間を指定します。サーバーが一時停止しても管理リクエストは処理されます。

正常なシャットダウンは、リクエストがサーバーに入るエントリーポイントを中心にサーバー全体のレベルで調整されます。以下のサブシステムが正常なシャットダウンをサポートします。

Undertow
undertow サブシステムはすべてのリクエストが終了するまで待機します。
mod_cluster
modcluster サブシステムは PRE_SUSPEND フェーズでサーバーが一時停止することをロードバランサーに通知します。
EJB
ejb3 サブシステムはすべてのリモート EJB リクエストおよび MDB メッセージ配信が終了するまで待機します。MDB への配信は PRE_SUSPEND フェーズで停止します。EJB タイマーは中断され、サーバーが再開したときにタイマーがアクティベートされます。
Transactions

サーバーは一時停止すると新しいリクエストを受け付けませんが、インフライトトランザクションおよびリクエストは完了するかタイムアウトが期限切れになるまで継続されます。これは、XTS トランザクションに関連する web サービスリクエストも同様です。

注記

デフォルトでは、ejb サブシステムでのトランザクションの正常シャットダウンは無効になっています。EJB 関連のトランザクションが完了してからサーバーを一時停止する場合は、トランザクションの正常シャットダウンを有効にする必要があります。例を以下に示します。

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

サーバーはすべてのアクティブなジョブが終了するまで待機します。キューに置かれたジョブはすべてスキップされます。現在、EE Concurrency には永続性がないため、キューに置かれスキップされたジョブは失われます。

サーバーが一時停止状態である間、スケジュールされたタスクはスケジュールどおりの時間に実行されますが、java.lang.IllegalStateException が発生します。サーバーが再開されると、スケジュールされたタスクは通常どおり実行され、ほとんどの場合でタスクのスケジュールを変更する必要はありません。

Batch
サーバーはタイムアウト期間内の実行中のジョブをすべて停止し、スケジュール済みのジョブをすべて延期します。
注記

現在、正常シャットダウンは新しいインバウンド JMS メッセージを拒否しません。インフライトアクティビティーによってスケジュールされた EE バッチジョブおよび EE 同時実行タスクは、現在実行の継続が許可されます。しかし、タイムアウトウインドウを渡す EE 同時実行タスクが提出されると、実行時にエラーが発生します。

リクエストは request-controller サブシステムによって追跡されます。このサブシステムがないと、一時停止および再開機能が制限され、リクエストの完了を待たずにサーバーが一時停止またはシャットダウンします。 しかし、この機能が必要ない場合は、request-controller サブシステムを削除してパフォーマンスを若干向上することができます。

2.4.1. サーバーの一時停止

JBoss EAP 7 には、サーバーの操作を正常に一時停止する suspend モードが導入されました。このモードでは、アクティブなリクエストがすべて正常に完了されますが、新しいリクエストは許可されません。サーバーが中断されたら、シャットダウンすることができます。 さらに、元の実行状態に戻ったり、中断状態のままメンテナンスを実行することができます。

注記

管理インターフェイスのサーバーの一時停止よる影響はありません。

管理コンソールまたは管理 CLI を使用するとサーバーを一時停止および再開できます。

サーバーの一時停止状態のチェック

以下の管理 CLI コマンドを使用するとサーバーの中断状態を表示できます。結果の値は、RUNNINGPRE_SUSPENDSUSPENDING、または SUSPENDED のいずれかになります。

  • スタンドアロンサーバーの中断状態をチェックします。

    :read-attribute(name=suspend-state)
  • 管理対象ドメインのサーバーの中断状態をチェックします。

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

アクティブなリクエストが完了するまでサーバーが待機するタイムアウト値を秒単位で指定し、以下の管理 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)
再開

resume コマンドは、新しいリクエストを受け入れるために、サーバーを通常の実行状態に戻します。ホスト、サーバー、サーバーグループ、またはドメインレベルでコマンドを起動できます。以下に例を示します。

:resume
サーバーを一時停止状態で起動

サーバーを一時停止状態で起動し、サーバーが再開するまでリクエストを受け入れないようにすることができます。

  • スタンドアロンサーバーを一時停止状態で起動するには、JBoss EAP インスタンスの起動時に --start-mode=suspend ランタイム引数を使用します。

    $ EAP_HOME/bin/standalone.sh --start-mode=suspend
  • 管理対象ドメインサーバーを一時停止モードで起動するには、管理 CLI コマンドで start-mode=suspend 引数を start 操作に渡します。

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

    start-mode 引数をサーバーの reload および restart 操作に渡すこともできます。

  • 管理対象ドメインサーバーグループのすべてのサーバーを一時停止モードで起動するには、管理 CLI コマンドで start-mode=suspend 引数を start-servers 操作に渡します。

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

    start-mode 引数をサーバーグループの reload-servers および restart-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 シグナルを使用したサーバーの正常なシャットダウン

kill -15 PID などで OS TERM シグナルを送信すると、サーバーを正常にシャットダウンできます。デフォルトでは、この値は管理 CLI の shutdown --suspend-timeout=0 コマンドの値と同じであるため、現在処理中のリクエストを即座に終了できます。タイムアウトは、org.wildfly.sigterm.suspend.timeout システムプロパティーで設定でき、サーバーのシャットダウン前に待機する最大秒数を指定します。-1 を値として指定すると、サーバーは永久に待機します。

重要

管理対象ドメインでは、OS シグナルを使用してサーバーをシャットダウンしないでください。サーバーは、管理するホストコントローラーより 管理 CLI を使用してシャットダウン してください。

シグナルの処理を無効にするよう JVM が設定された場合 (-Xrs java 引数が JVM オプションに渡された場合など) や、プロセスが送信されたシグナルに応答できない場合 (KILL シグナルが送信された場合など)、OS シグナルを使用して正常にシャットダウンすることはできません。