ローリングデプロイやアプリケーションの再起動中に、実行中の XXL-JOB タスクが途中で中断され、ビジネスデータの不整合やスケジューリングの失敗を引き起こす可能性があります。Microservices Engine (MSE) XXL-JOB は、SchedulerX プラグインを通じて組み込みのグレースフルシャットダウン機能を提供します。この機能は、エグゼキュータからトラフィックをドレインし、実行中のジョブが完了するのを待ってからプロセスを停止します。オープンソースの XXL-JOB サーバーコードを変更する必要はありません。
仕組み
グレースフルシャットダウンが有効な場合、MSE XXL-JOB はエグゼキュータを停止する前に、次のシーケンスに従います。
エグゼキュータの登録解除 -- エグゼキュータは
registryRemoveリクエストを MSE XXL-JOB サーバーに送信し、自身をアクティブなエグゼキュータリストから即座に削除します。サーバーはaddress_listをxxl_job_groupテーブルでリアルタイムに更新するため、新しいジョブはこのノードにディスパッチされません。実行中のジョブの待機 -- シャットダウンモードに応じて、エグゼキュータは実行中のすべてのジョブ (およびオプションで
JobThreadキュー内のキューイングされたジョブ) が完了するのを待ちます。実行結果の報告 --
TriggerCallbackThreadは、保留中のすべての実行結果をサーバーにフラッシュします。プロセスの停止 -- JVM シャットダウンフックが完了し、アプリケーションプロセスが終了します。
オープンソース XXL-JOB の機能拡張が必要な理由
前提条件
開始する前に、以下を確認してください。
MSE XXL-JOB エンジンのバージョン 2.1.0 以降。詳しくは、「XXL-JOB のリリースノート」をご参照ください。
プロジェクトに SchedulerX プラグインの依存関係が追加されています。詳細については、「XXL-JOB プラグインのリリースノート」をご参照ください。
次の依存関係を pom.xml に追加します。
<dependency>
<groupId>com.aliyun.schedulerx</groupId>
<artifactId>schedulerx3-plugin-xxljob</artifactId>
<version>最新バージョン</version>
</dependency>プラグインとエグゼキュータの統合
アプリケーションフレームワークに合った統合方法を選択してください。
Spring Boot (推奨)
プラグインは Spring Boot の自動構成を通じてグレースフルシャットダウンを自動的に登録します。追加のコードは不要です。
シャットダウンモードを application.properties に追加します。
xxl.job.executor.shutdownMode=WAIT_ALLまたは application.yml で:
xxl:
job:
executor:
shutdownMode: WAIT_ALLSpring (Boot 以外)
Spring Web アプリケーションの場合、上記の Spring Boot セクションの Maven 依存関係と application.properties 構成を追加し、次にプラグインイニシャライザを web.xml に登録します。
<web-app>
<context-param>
<param-name>globalInitializerClasses</param-name>
<param-value>com.aliyun.schedulerx.xxljob.enhance.XxlJobExecutorEnhancerInitializer</param-value>
</context-param>
</web-app>フレームワークなし (プレーン Java)
フレームワークなしでエグゼキュータを起動するアプリケーションの場合、プラグインの拡張機能を手動でロードし、JVM シャットダウンフックを登録します。
xxl-job-executor.properties にシャットダウンモードが含まれていることを確認してください。
xxl.job.executor.shutdownMode=WAIT_ALLアプリケーションのグレースフルストップ
シャットダウンモードは、JVM が SIGTERM シグナル (kill -15 に相当) を受信した場合にのみ有効になります。ご利用のデプロイ環境に合った方法を選択してください。
Spring Boot アプリケーションで Spring Boot Actuator が有効になっている場合、/actuator/shutdown エンドポイントを通じてグレースフルシャットダウンをトリガーすることもできます。
セルフマネージド CD パイプライン
SIGTERM を送信し、アプリケーションが終了するのを待ち、タイムアウト時に SIGKILL にフォールバックする stop.sh スクリプトを作成します。
Kubernetes
Kubernetes はデフォルトでコンテナ内の PID 1 に SIGTERM を送信し、これにより JVM シャットダウンフックが自動的にトリガーされます。
アプリケーションが PID 1 でない場合 (例えば、マルチプロセスコンテナ内)、preStop フックを構成してシグナルを明示的に送信します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
# デフォルト: 30。予想される最大ジョブ実行時間よりも長い値を設定します。
terminationGracePeriodSeconds: 30
containers:
- name: my-app-container
image: my-app-image:latest
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "kill -15 <app-pid> && sleep 30"]terminationGracePeriodSeconds には、予想される最大ジョブ実行時間よりも長い値を設定してください。猶予期間がジョブの完了前に終了すると、Kubernetes は SIGKILL を送信して Pod を強制終了させるため、グレースフルシャットダウンが無効になります。デフォルト値は 30 秒です。
Alibaba Cloud アプリケーションリリースプラットフォーム
Alibaba Cloud アプリケーションリリースプラットフォーム向けの自動グレースフルシャットダウン統合は、まもなく利用可能になります。
シャットダウンモードのリファレンス
| モード | 動作 | 使用場面 |
|---|---|---|
WAIT_ALL (推奨) | 終了する前に、実行中のすべてのジョブおよびキュー内のジョブが完了するのを待ちます。 | ほとんどの本番ワークロード。ジョブは失われません。 |
WAIT_RUNNING | 現在実行中のジョブが完了するのを待ちます。キュー内のジョブは破棄されます。 | キュー内のジョブよりも高速な再起動が優先される、レイテンシーに敏感なデプロイメント。 |
| 未構成 | デフォルトのオープンソース XXL-JOB の動作を使用します。実行中のジョブは中断され、キュー内のジョブは破棄されます。 | 本番環境では推奨されません。 |
アプリケーションプロパティでシャットダウンモードを構成します。
# グレースフルシャットダウンモード。有効な値: WAIT_ALL、WAIT_RUNNING。
# 未構成の場合、デフォルトのオープンソース XXL-JOB の動作が適用されます (グレースフルシャットダウンなし)。
xxl.job.executor.shutdownMode=WAIT_ALLまたは application.yml で:
xxl:
job:
executor:
# グレースフルシャットダウンモード。有効な値: WAIT_ALL、WAIT_RUNNING。
shutdownMode: WAIT_ALL


