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

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 |
| Aplikasi hanya akan keluar setelah semua tugas dan pekerjaan dalam aplikasi selesai. |
| 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.
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.
Tambahkan dependensi Actuator ke file
pom.xmlAnda:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>Aktifkan endpoint shutdown:
management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=shutdownPanggil endpoint shutdown:
curl -X GET http://NodeIP:Port/actuator/shutdownMetode 3: Gunakan antarmuka HTTP SchedulerX
Aktifkan server HTTP bawaan SchedulerX untuk menerima permintaan shutdown dari sistem eksternal.
Tambahkan konfigurasi berikut:
# Aktifkan antarmuka layanan HTTP. Default: false.
spring.schedulerx2.httpServerEnable=true
# Port antarmuka shutdown HTTP. Default: 51886.
spring.schedulerx2.httpServerPort=51886Panggil titik akhir HTTP berikut untuk memicu shutdown yang mulus:
curl -X GET http://NodeIP:51886/schedulerx/worker/shutdownIntegrasikan 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:
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."
fiIntegrasikan 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: HTTPIntegrasikan 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.