All Products
Search
Document Center

Microservices Engine:Shutdown yang mulus untuk tugas terjadwal

Last Updated:Mar 01, 2026

Saat Anda melakukan restart atau redeploy aplikasi yang menggunakan SchedulerX, tugas terjadwal yang sedang berjalan dapat terganggu dan berpotensi menyebabkan pemrosesan data tidak lengkap. Shutdown yang mulus memungkinkan tugas yang sedang berjalan diselesaikan terlebih dahulu sebelum proses aplikasi dihentikan.

Diagram shutdown yang mulus

image

Prasyarat

Versi client SchedulerX harus 1.10.8 atau lebih baru.

Konfigurasi shutdown yang mulus

SchedulerX mendukung shutdown yang mulus untuk tugas dalam mode standalone dan mode distributed. Berbeda dengan layanan online real-time, tugas terjadwal offline mungkin memerlukan waktu lama untuk diselesaikan. Oleh karena itu, tetapkan timeout untuk mencegah proses aplikasi menunggu tanpa batas.

Tambahkan properti berikut ke konfigurasi Spring Boot Anda:

# Mode shutdown yang mulus. WAIT_ALL: Tunggu hingga semua tugas selesai. WAIT_RUNNING: Tunggu hingga tugas yang sedang berjalan selesai.
# Jika parameter ini tidak dikonfigurasi, fitur shutdown yang mulus dinonaktifkan. Secara default, fitur shutdown yang mulus dinonaktifkan.
spring.schedulerx2.graceShutdownMode=WAIT_ALL
# Periode timeout untuk shutdown yang mulus. Satuan: detik. Secara default, tidak ada periode timeout yang ditentukan untuk shutdown yang mulus.
spring.schedulerx2.graceShutdownTimeout=10

# Menentukan apakah port yang diperlukan oleh layanan HTTP diaktifkan. Nilai default: false.
spring.schedulerx2.httpServerEnable=true
# Port tempat antarmuka HTTP khusus shutdown dapat dipanggil. Port default: 51886.
spring.schedulerx2.httpServerPort=52333

Mode shutdown

Mode

Perilaku

WAIT_ALL (direkomendasikan)

Aplikasi hanya akan keluar setelah semua tugas dan pekerjaan dalam aplikasi selesai.

WAIT_RUNNING

Aplikasi keluar setelah tugas dan pekerjaan yang sedang berjalan—dan telah dialokasikan thread—selesai. Tugas dan pekerjaan dalam antrian akan dibuang.

Picu shutdown yang mulus

Gunakan salah satu dari tiga metode berikut untuk memicu shutdown yang mulus.

Metode 1: Kirim sinyal SIGTERM (kill -15)

SDK SchedulerX mendaftarkan JVM shutdown hook yang secara otomatis memicu shutdown yang mulus. Kirim sinyal SIGTERM ke proses aplikasi:

kill -15 <Process ID>

Proses akan menunggu tugas yang sedang berjalan selesai sesuai dengan mode dan timeout shutdown yang dikonfigurasi, lalu keluar.

Penting

Jangan langsung menjalankan kill -9. Sinyal ini memaksa penghentian seketika dan melewati mekanisme shutdown yang mulus. Sebagai gantinya, jalankan terlebih dahulu kill -15, pantau aplikasi selama beberapa waktu, lalu jalankan kill -9 hanya jika proses belum berhenti. Tetapkan timeout shutdown yang mulus yang sesuai dengan karakteristik tugas Anda untuk mencegah proses rilis yang terlalu lambat.

Metode 2: Gunakan event shutdown Spring Boot

Jika aplikasi Anda menggunakan Spring Boot bersama SchedulerX, gunakan Spring Boot Actuator untuk memicu shutdown yang mulus melalui event shutdown container Spring.

  1. Tambahkan dependensi Actuator ke file pom.xml Anda:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  1. Aktifkan endpoint shutdown:

management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=shutdown
  1. Panggil endpoint shutdown:

curl -X GET http://NodeIP:Port/actuator/shutdown

Metode 3: Gunakan antarmuka HTTP SchedulerX

Aktifkan server HTTP bawaan SchedulerX untuk menerima permintaan shutdown dari sistem eksternal.

  1. Tambahkan konfigurasi berikut:

# Aktifkan antarmuka layanan HTTP. Default: false.
spring.schedulerx2.httpServerEnable=true
# Port antarmuka shutdown HTTP. Default: 51886.
spring.schedulerx2.httpServerPort=51886

Panggil titik akhir HTTP berikut untuk memicu shutdown yang mulus:

curl -X GET http://NodeIP:51886/schedulerx/worker/shutdown

Integrasikan shutdown yang mulus ke dalam alur kerja penerapan

Integrasikan shutdown yang mulus ke dalam proses rilis operasi dan maintenance (O&M) Anda untuk mencegah gangguan pada tugas terjadwal saat aplikasi direstart.

Integrasikan ke dalam proses continuous delivery (CD) buatan sendiri

Pipa CD khas mencakup langkah untuk menghentikan proses aplikasi. Sertakan logika shutdown yang mulus dalam skrip stop Anda dengan menggunakan salah satu dari tiga metode pemicu berdasarkan kebutuhan Anda.

Contoh proses CD:

image

Skrip berikut menunjukkan cara menghentikan proses aplikasi dengan shutdown yang mulus:

# Setelah aplikasi dijalankan, ID proses ditulis ke file app.pid.
PID="{Application deployment path}/app.pid"
FORCE=1
if [ -f ${PID} ]; then
  TARGET_PID=`cat ${PID}`
  kill -15 ${TARGET_PID}
  loop=1
  while(( $loop<=5 ))
  do
    # health: Menentukan apakah proses aplikasi saat ini telah berakhir. Anda dapat mengonfigurasi bidang health sesuai kebutuhan bisnis Anda.
    health
    if [ $? == 0 ]; then
      echo "check $loop times, current app has not stop yet."
      sleep 5s
      let "loop++"
    else
      FORCE=0
      break
    fi
  done
  if [ $FORCE -eq 1 ]; then
  	echo "App(pid:${TARGET_PID}) stop timeout, forced termination."
    kill -9 ${TARGET_PID}
  fi
  rm -rf ${PID}
  echo "App(pid:${TARGET_PID}) stopped successful."
fi

Integrasikan ke dalam kait PreStop Kubernetes

Gunakan kait siklus hidup PreStop Kubernetes untuk memicu shutdown yang mulus sebelum sebuah Pod dihentikan. Tersedia dua pendekatan: skrip exec dan permintaan HTTP.

Pendekatan skrip exec

Jalankan skrip stop atau kirim sinyal SIGTERM secara langsung:

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"]

Pendekatan permintaan HTTP

Lakukan permintaan HTTP GET ke endpoint shutdown:

  • Untuk aplikasi Spring Boot dengan Actuator diaktifkan, atur path ke /actuator/shutdown.

  • Untuk aplikasi non-Spring, aktifkan server HTTP SchedulerX dan atur path ke /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

Integrasikan dengan platform penerapan Alibaba Cloud

Jika Anda melakukan penerapan melalui Enterprise Distributed Application Service (EDAS) atau melalui Microservices Engine (MSE) dengan Container Service for Kubernetes (ACK), platform tersebut secara otomatis mengintegrasikan shutdown yang mulus SchedulerX setelah Anda mengaktifkan fitur tersebut. Untuk informasi lebih lanjut, lihat Gracefully shut down Spring Cloud applications dan Graceful shutdown.