SchedulerX を使用するアプリケーションを再起動または再デプロイすると、実行中のスケジュールされたジョブが中断される可能性があり、不完全なデータ処理を引き起こすことがあります。グレースフルシャットダウンにより、アプリケーションプロセスが終了する前に実行中のジョブを完了させることができます。
グレースフルシャットダウンのフロー図

前提条件
SchedulerX クライアントのバージョンは 1.10.8 以降 である必要があります。
グレースフルシャットダウンの構成
SchedulerX では、スタンドアロン モードおよび 分散 モードで実行されるジョブに対してグレースフルシャットダウンをサポートしています。リアルタイムのオンラインサービスとは異なり、オフラインのスケジュールされたジョブは完了までに長時間を要することがあります。無限待機を防ぐため、タイムアウトを設定してください。
Spring Boot の構成ファイルに以下のプロパティを追加します:
# グレースフルシャットダウンモード。WAIT_ALL:すべてのジョブの完了を待機。WAIT_RUNNING:実行中のジョブの完了を待機。
# このパラメーターを構成しない場合、グレースフルシャットダウン機能は無効になります。デフォルトでは、グレースフルシャットダウン機能は無効です。
spring.schedulerx2.graceShutdownMode=WAIT_ALL
# グレースフルシャットダウンのタイムアウト期間(単位:秒)。デフォルトでは、タイムアウト期間は指定されません。
spring.schedulerx2.graceShutdownTimeout=10
# HTTP サービスに必要なポートを有効化するかどうかを指定します。デフォルト値:false。
spring.schedulerx2.httpServerEnable=true
# シャットダウン目的の HTTP インターフェイスを呼び出すポート。デフォルトポート:51886。
spring.schedulerx2.httpServerPort=52333
シャットダウンモード
モード | 動作 |
| アプリケーションは、アプリケーション内のすべてのジョブおよびタスクが完了した後にのみ終了します。 |
| アプリケーションは、スレッドが割り当てられた実行中のジョブおよびタスクが完了した後に終了します。キュー内のジョブおよびタスクは破棄されます。 |
グレースフルシャットダウンのトリガー
以下の 3 つの方法のいずれかを使用して、グレースフルシャットダウンを開始できます。
方法 1:SIGTERM シグナルの送信(kill -15)
SchedulerX SDK は JVM シャットダウンフックを登録しており、これによりグレースフルシャットダウンが自動的に開始されます。アプリケーションプロセスに対して SIGTERM シグナルを送信します:
kill -15 <プロセス ID>プロセスは、構成されたシャットダウンモードおよびタイムアウトに基づき、実行中のジョブの完了を待機した後、終了します。
kill -9 を直接実行しないでください。このシグナルは即時強制終了を実行し、グレースフルシャットダウンをバイパスします。代わりに、まず kill -15 を実行し、一定期間アプリケーションの状態をモニターしたうえで、プロセスが終了しない場合にのみ kill -9 を実行してください。ジョブの特性に応じて適切なグレースフルシャットダウンタイムアウトを設定し、極端に遅いリリースプロセスを防止してください。
方法 2:Spring Boot シャットダウンイベントの使用
アプリケーションが SchedulerX とともに Spring Boot を使用している場合、Spring Boot Actuator を活用して、Spring コンテナーのシャットダウンイベント経由でグレースフルシャットダウンを開始できます。
pom.xmlファイルに Actuator の依存関係を追加します:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>シャットダウンエンドポイントを有効化します:
management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=shutdownシャットダウンエンドポイントを呼び出します:
curl -X GET http://ノードIP:ポート/actuator/shutdown方法 3:SchedulerX HTTP インターフェイスの使用
SchedulerX 組み込みの HTTP サーバーを有効化し、外部システムからのシャットダウン要求を受け付けます。
以下の構成を追加します:
# HTTP サービスインターフェイスを有効化します。デフォルト:false。
spring.schedulerx2.httpServerEnable=true
# HTTP シャットダウンインターフェイスのポート。デフォルト:51886。
spring.schedulerx2.httpServerPort=51886以下の HTTP エンドポイントを呼び出して、グレースフルシャットダウンを開始します:
curl -X GET http://ノードIP:51886/schedulerx/worker/shutdownデプロイメントワークフローへのグレースフルシャットダウンの統合
運用・保守(O&M)のリリースプロセスにグレースフルシャットダウンを統合し、アプリケーションの再起動時にスケジュールされたジョブが中断されないようにします。
自社構築の継続的デリバリー(CD)プロセスへの統合
典型的な CD パイプラインには、アプリケーションプロセスを停止するステップが含まれます。停止スクリプトにグレースフルシャットダウンのロジックを組み込み、要件に応じて上記の 3 つのトリガーメソッドのいずれかを使用します。
サンプル CD プロセス:
以下は、グレースフルシャットダウンを伴うアプリケーションプロセスの停止方法を示すスクリプト例です:
# アプリケーション起動後、プロセス ID が app.pid ファイルに書き込まれます。
PID="{アプリケーションデプロイパス}/app.pid"
FORCE=1
if [ -f ${PID} ]; then
TARGET_PID=`cat ${PID}`
kill -15 ${TARGET_PID}
loop=1
while(( $loop<=5 ))
do
# health:現在のアプリケーションプロセスが終了したかどうかを判定します。ビジネス要件に応じて health フィールドを構成できます。
health
if [ $? == 0 ]; then
echo "チェック $loop 回目、現在のアプリケーションはまだ停止していません。"
sleep 5s
let "loop++"
else
FORCE=0
break
fi
done
if [ $FORCE -eq 1 ]; then
echo "アプリケーション(PID:${TARGET_PID})の停止がタイムアウトしました。強制終了します。"
kill -9 ${TARGET_PID}
fi
rm -rf ${PID}
echo "アプリケーション(PID:${TARGET_PID})の停止が完了しました。"
fiKubernetes PreStop フックへの統合
Kubernetes の PreStop ライフサイクルフックを使用して、Pod が終了する前にグレースフルシャットダウンを開始します。実行スクリプト(exec)方式と HTTP リクエスト方式の 2 つのアプローチがあります。
実行スクリプト(exec)方式
停止スクリプトを実行するか、直接 SIGTERM シグナルを送信します:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: my-app-image:latest
lifecycle:
preStop:
exec:
# command: ["/bin/sh", "-c", "kill -15 PID && sleep 30"]
command: ["/bin/sh", "-c", "Script path /stop.sh"]HTTP リクエスト方式
HTTP GET リクエストを介してシャットダウンエンドポイントを呼び出します:
Actuator が有効化された Spring Boot アプリケーションの場合、パスを
/actuator/shutdownに設定します。Spring 以外のアプリケーションの場合、SchedulerX HTTP サーバーを有効化し、パスを
/schedulerx/worker/shutdownに設定します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: my-app-image:latest
lifecycle:
preStop:
httpGet:
path: /schedulerx/worker/shutdown
port: 51886
scheme: HTTPAlibaba Cloud デプロイメントプラットフォームとの統合
Enterprise Distributed Application Service (EDAS) または Microservices Engine (MSE) を使用して Container Service for Kubernetes (ACK) 上にデプロイする場合、本機能を有効化すると、プラットフォームが自動的に SchedulerX のグレースフルシャットダウンを統合します。詳細については、「Spring Cloud アプリケーションのグレースフルシャットダウン」および「グレースフルシャットダウン」をご参照ください。