すべてのプロダクト
Search
ドキュメントセンター

Microservices Engine:スケジュールされたジョブのグレースフルシャットダウン

最終更新日:Mar 01, 2026

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

グレースフルシャットダウンのフロー図

image

前提条件

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

シャットダウンモード

モード

動作

WAIT_ALL(推奨)

アプリケーションは、アプリケーション内のすべてのジョブおよびタスクが完了した後にのみ終了します。

WAIT_RUNNING

アプリケーションは、スレッドが割り当てられた実行中のジョブおよびタスクが完了した後に終了します。キュー内のジョブおよびタスクは破棄されます。

グレースフルシャットダウンのトリガー

以下の 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 コンテナーのシャットダウンイベント経由でグレースフルシャットダウンを開始できます。

  1. pom.xml ファイルに Actuator の依存関係を追加します:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  1. シャットダウンエンドポイントを有効化します:

management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=shutdown
  1. シャットダウンエンドポイントを呼び出します:

curl -X GET http://ノードIP:ポート/actuator/shutdown

方法 3:SchedulerX HTTP インターフェイスの使用

SchedulerX 組み込みの HTTP サーバーを有効化し、外部システムからのシャットダウン要求を受け付けます。

  1. 以下の構成を追加します:

# 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 プロセス:

image

以下は、グレースフルシャットダウンを伴うアプリケーションプロセスの停止方法を示すスクリプト例です:

# アプリケーション起動後、プロセス 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})の停止が完了しました。"
fi

Kubernetes 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: HTTP

Alibaba Cloud デプロイメントプラットフォームとの統合

Enterprise Distributed Application Service (EDAS) または Microservices Engine (MSE) を使用して Container Service for Kubernetes (ACK) 上にデプロイする場合、本機能を有効化すると、プラットフォームが自動的に SchedulerX のグレースフルシャットダウンを統合します。詳細については、「Spring Cloud アプリケーションのグレースフルシャットダウン」および「グレースフルシャットダウン」をご参照ください。