2.4. JBoss EAP の正常な一時停止およびシャットダウン
JBoss EAP は正常に一時停止およびシャットダウンできます。これにより、新しいリクエストを許可せずにアクティブなリクエストを正常に完了できます。タイムアウト値は、一時停止またはシャットダウン操作がアクティブなリクエストの完了まで待つ期間を指定します。サーバーが一時停止しても管理リクエストは処理されます。
正常なシャットダウンは、リクエストがサーバーに入るエントリーポイントを中心にサーバー全体のレベルで調整されます。以下のサブシステムが正常なシャットダウンをサポートします。
- Undertow
-
undertow
サブシステムはすべてのリクエストが終了するまで待機します。 - mod_cluster
-
modcluster
サブシステムはPRE_SUSPEND
フェーズでサーバーが一時停止することをロードバランサーに通知します。 ejb3
-
ejb3
サブシステムはすべてのリモート Jakarta Enterprise Beans リクエストおよび MDB メッセージ配信が終了するまで待機します。MDB への配信はPRE_SUSPEND
フェーズで停止します。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 Messaging メッセージを拒否しません。インフライトアクティビティーによってスケジュールされた Jakarta Batch ジョブおよび Jakarta Concurrency タスクは、現在実行の継続が許可されます。しかし、タイムアウトウインドウを渡す Jakarta Concurrency タスクが提出されると、実行時にエラーが発生します。
リクエストは request-controller
サブシステムによって追跡されます。このサブシステムがないと、一時停止および再開機能が制限され、リクエストの完了を待たずにサーバーが一時停止またはシャットダウンします。しかし、この機能が必要ない場合は、request-controller
サブシステムを削除してパフォーマンスを若干向上することができます。
2.4.1. サーバーの一時停止
JBoss EAP 7 には、サーバーの操作を正常に一時停止する suspend モードが導入されました。このモードでは、アクティブなリクエストがすべて正常に完了されますが、新しいリクエストは許可されません。サーバーが中断されたら、シャットダウンすることができます。 さらに、元の実行状態に戻ったり、中断状態のままメンテナンスを実行することができます。
管理インターフェイスのサーバーの一時停止よる影響はありません。
管理コンソールまたは管理 CLI を使用するとサーバーを一時停止および再開できます。
サーバーの一時停止状態のチェック
以下の管理 CLI コマンドを使用するとサーバーの中断状態を表示できます。結果の値は、RUNNING
、PRE_SUSPEND
、SUSPENDING
、または 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 シグナルを使用して正常にシャットダウンすることはできません。