Topik ini menjelaskan cara mematikan pekerjaan dan tugas yang dieksekusi dalam aplikasi dengan anggun.
Informasi latar belakang
Dalam skenario bisnis nyata, pekerjaan terjadwal terus dieksekusi dalam proses aplikasi pada interval tetap. Saat aplikasi di-restart selama rilis, proses aplikasi harus sementara dimatikan. Jika Anda menutup aplikasi, pekerjaan terjadwal yang sedang berjalan akan terganggu, yang dapat menyebabkan data tidak lengkap atau masalah lainnya. Untuk mencegah situasi ini, SchedulerX memungkinkan Anda mengimplementasikan penghentian dengan anggun untuk pekerjaan terjadwal. Anda harus menunggu hingga pekerjaan yang sedang berjalan selesai sebelum aman menutup aplikasi.
Batasan
Versi klien SchedulerX harus 1.10.8 atau lebih baru.
Diagram penghentian dengan anggun

Cara Mengonfigurasi
SchedulerX menyediakan fitur penghentian dengan anggun untuk pekerjaan yang dieksekusi dalam mode standalone dan terdistribusi. Berbeda dengan pekerjaan daring waktu nyata, pekerjaan terjadwal luring mungkin memerlukan waktu lama untuk diselesaikan. Namun, proses aplikasi tidak menunggu tanpa batas waktu untuk pekerjaan terjadwal luring selesai setelah Anda mengaktifkan fitur penghentian dengan anggun. Anda dapat menjalankan kode berikut untuk memperpanjang periode waktu sebelum proses aplikasi dimatikan:
# Mode penghentian dengan anggun. WAIT_ALL: Tunggu semua pekerjaan selesai. WAIT_RUNNING: Tunggu pekerjaan yang sedang berjalan selesai.
# Jika Anda tidak mengonfigurasi parameter ini, fitur penghentian dengan anggun dinonaktifkan. Secara default, fitur penghentian dengan anggun dinonaktifkan.
spring.schedulerx2.graceShutdownMode=WAIT_ALL
# Periode timeout untuk penghentian dengan anggun. Unit: detik. Secara default, tidak ada periode timeout untuk penghentian dengan anggun yang ditentukan.
spring.schedulerx2.graceShutdownTimeout=10
# Menentukan apakah port yang diperlukan oleh layanan HTTP diaktifkan. Nilai default: false.
spring.schedulerx2.httpServerEnable=true
# Port tempat Anda dapat memanggil antarmuka HTTP untuk tujuan shutdown. Port default: 51886.
spring.schedulerx2.httpServerPort=52333Mode penghentian dengan anggun | Deskripsi |
| Dalam mode ini, aplikasi keluar hanya setelah semua pekerjaan dan tugas dalam aplikasi selesai. Mode ini direkomendasikan. |
| Dalam mode ini, aplikasi keluar setelah pekerjaan dan tugas yang sedang berjalan ke mana thread dialokasikan dalam aplikasi selesai. Pekerjaan dan tugas dalam antrian dihapus. |
Prosedur
Untuk memudahkan integrasi proses rilis dalam berbagai mode penyebaran ke aplikasi Anda, Anda dapat menggunakan salah satu dari metode berikut untuk mengaktifkan fitur penghentian dengan anggun:
Metode 1: Matikan proses aplikasi dengan anggun menggunakan kill -15
SDK SchedulerX menyediakan fungsi panggilan balik yang diperlukan untuk mematikan proses Java Virtual Machine (JVM), yang membuat aplikasi keluar dengan anggun. Jika Anda ingin mematikan proses aplikasi, Anda dapat menjalankan perintah kill -15 ID Proses. Dalam hal ini, proses yang sedang berjalan dimatikan dengan anggun setelah pekerjaan dan tugas selesai berdasarkan kebijakan yang dikonfigurasi.
Saat Anda mengeksekusi skrip untuk mematikan aplikasi, kami sarankan agar Anda tidak langsung menjalankan perintah kill -9. Jika tidak, penghentian dengan anggun tidak akan berfungsi. Untuk beberapa aplikasi, kami sarankan agar Anda pertama-tama menjalankan perintah kill -15, memantau aplikasi selama periode waktu tertentu, dan kemudian menjalankan perintah kill -9 untuk memaksa mematikan aplikasi. Kami sarankan agar Anda menentukan periode waktu tunggu untuk penghentian dengan anggun berdasarkan atribut pekerjaan Anda untuk mencegah proses rilis yang sangat lambat.
Metode 2: Matikan proses aplikasi dengan anggun menggunakan acara shutdown SpringBoot
Jika Anda menghubungkan aplikasi SpringBoot yang diinisialisasi ke SchedulerX, Anda dapat menggunakan fitur actuator yang disediakan oleh SpringBoot untuk mengimplementasikan penghentian dengan anggun. Fitur actuator dapat mematikan pekerjaan terjadwal dengan anggun sambil merespons acara shutdown kontainer Spring.
Untuk mengaktifkan fitur actuator SpringBoot, lakukan langkah-langkah berikut:
Jalankan kode berikut untuk menambahkan dependensi ke file
pom.xmldari aplikasi yang diinginkan:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>Jalankan kode berikut untuk mengaktifkan port shutdown:
management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=shutdownJalankan kode berikut untuk mengimplementasikan penghentian dengan anggun:
curl -X GET http://NodeIP:Port/actuator/shutdownMetode 3: Matikan proses aplikasi dengan anggun menggunakan antarmuka HTTP
Konfigurasikan parameter berikut untuk mengaktifkan port yang diperlukan oleh layanan HTTP untuk menanggapi permintaan eksternal guna mematikan pekerjaan terjadwal dalam proses aplikasi saat ini. Parameter:
# Menentukan apakah port yang diperlukan oleh layanan HTTP diaktifkan. Nilai default: false.
spring.schedulerx2.httpServerEnable=true
# Port tempat Anda dapat memanggil antarmuka HTTP untuk tujuan shutdown. Port default: 51886.
spring.schedulerx2.httpServerPort=51886Anda dapat memanggil antarmuka HTTP berikut untuk mematikan pekerjaan terjadwal dengan anggun:
curl -X GET http://NodeIP:51886/schedulerx/worker/shutdownSolusi integrasi
Dalam kebanyakan kasus, fitur penghentian dengan anggun perlu diintegrasikan ke dalam proses O&M yang dirilis setiap hari untuk mencegah pekerjaan terjadwal rusak saat aplikasi di-restart. Anda dapat menggunakan salah satu solusi integrasi reguler berikut berdasarkan kebutuhan bisnis Anda.
Skenario 1: Integrasikan penghentian dengan anggun ke dalam proses CD yang dibuat sendiri
Dalam kebanyakan kasus, proses pengiriman berkelanjutan (CD) yang dibuat sendiri mencakup node tempat Anda dapat menghentikan proses aplikasi. Anda dapat membuat dan mengeksekusi skrip stop.sh di node tersebut untuk membuat proses aplikasi Anda keluar. Anda harus menyertakan logika pemrosesan penghentian dengan anggun dalam isi skrip. Anda dapat merujuk ke salah satu metode sebelumnya berdasarkan kebutuhan bisnis Anda.
Contoh proses CD:
Kode berikut memberikan contoh skrip yang digunakan untuk mematikan proses aplikasi:
# Setelah Anda memulai aplikasi, ID proses ditulis ke dalam file app.pid.
PID="{Path deployment aplikasi}/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 berakhir. Anda dapat mengonfigurasi bidang health berdasarkan kebutuhan bisnis Anda.
health
if [ $? == 0 ]; then
echo "memeriksa $loop kali, aplikasi saat ini belum berhenti."
sleep 5s
let "loop++"
else
FORCE=0
break
fi
done
if [ $FORCE -eq 1 ]; then
echo "App(pid:${TARGET_PID}) stop timeout, terminasi paksa."
kill -9 ${TARGET_PID}
if
rm -rf ${PID}
echo "App(pid:${TARGET_PID}) berhasil dihentikan."
fiSkenario 2: Integrasikan penghentian dengan anggun ke dalam acara PreStop penyebaran berbasis container Kubernetes
Anda dapat menggunakan acara PreStop yang digunakan untuk menghancurkan pod dalam kluster Kubernetes untuk memicu penghentian dengan anggun untuk aplikasi Anda. Selain itu, Anda dapat menggunakan exec untuk mengeksekusi skrip atau menginisiasi permintaan HTTP untuk memanggil fungsi hook PreStop guna mengimplementasikan penghentian dengan anggun.
Skrip Exec: Langsung matikan proses aplikasi. Atau, Anda dapat mengeksekusi skrip
stop.shyang telah diatur sebelumnya untuk membuat proses aplikasi keluar.
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"] Antarmuka HTTP:
Saat Anda mengaktifkan fitur shutdown actuator SpringBoot, Anda dapat mengatur Path ke
/actuator/shutdown.Untuk aplikasi non-Spring, Anda dapat mengatur Path ke
/schedulerx/worker/shutdownsetelah Anda mengaktifkan port tempat Anda dapat memanggil antarmuka HTTP menggunakan SDK SchedulerX untuk mengimplementasikan penghentian dengan anggun.
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: HTTPSkenario 3: Integrasikan penghentian dengan anggun ke dalam platform rilis aplikasi di Alibaba Cloud
Jika Anda merilis aplikasi Anda menggunakan Enterprise Distributed Application Service (EDAS) di Alibaba Cloud atau menggunakan Microservices Engine (MSE) dan Container Service for Kubernetes (ACK), fitur penghentian dengan anggun SchedulerX secara otomatis diintegrasikan ke dalam platform yang Anda gunakan setelah Anda mengaktifkan fitur penghentian dengan anggun di platform tersebut. Untuk informasi lebih lanjut, lihat Matikan Aplikasi Spring Cloud dengan Anggun dan Penghentian dengan Anggun.