L'arrêt gracieux garantit la fin des tâches SchedulerX en cours avant l'arrêt du processus applicatif lors d'un redémarrage ou d'un redéploiement, évitant ainsi tout traitement incomplet des données.
Schéma de l'arrêt gracieux

Prérequis
Le client SchedulerX doit être en version 1.10.8 ou ultérieure.
Configurer l'arrêt gracieux
SchedulerX prend en charge l'arrêt gracieux pour les tâches en mode standalone et en mode distributed. Comme l'exécution des tâches planifiées peut être longue, définissez un délai d'expiration pour éviter que les processus applicatifs n'attendent indéfiniment.
Ajoutez les propriétés suivantes à votre configuration Spring Boot :
# The graceful shutdown mode. WAIT_ALL: Wait for all jobs to complete. WAIT_RUNNING: Wait for running jobs to complete.
# If you do not configure this parameter, the graceful shutdown feature is disabled. By default, the graceful shutdown feature is disabled.
spring.schedulerx2.graceShutdownMode=WAIT_ALL
# The timeout period for graceful shutdown. Unit: seconds. By default, no timeout period for graceful shutdown is specified.
spring.schedulerx2.graceShutdownTimeout=10
# Specifies whether to enable the port required by the HTTP service. Default value: false.
spring.schedulerx2.httpServerEnable=true
# The port over which you can call the shutdown-purposed HTTP interface. Default port: 51886.
spring.schedulerx2.httpServerPort=52333
Modes d'arrêt
|
Mode |
Comportement |
|
|
L'application ne s'arrête qu'une fois toutes les tâches et tous les jobs terminés. |
|
|
L'application s'arrête une fois les jobs et les tâches en cours d'exécution (auxquels des threads sont alloués) terminés. Les jobs et les tâches en file d'attente sont abandonnés. |
Déclencher l'arrêt gracieux
Utilisez l'une des trois méthodes suivantes pour déclencher l'arrêt gracieux.
Méthode 1 : Envoyer un signal SIGTERM (kill -15)
Les SDK SchedulerX enregistrent un hook d'arrêt JVM qui déclenche automatiquement l'arrêt gracieux. Envoyez un signal SIGTERM au processus applicatif :
kill -15 <Process ID>
Le processus attend la fin des tâches en cours selon le mode d'arrêt et le délai d'expiration configurés, puis s'arrête.
N'exécutez pas directement kill -9. Ce signal force l'arrêt immédiat et contourne l'arrêt gracieux. Exécutez d'abord kill -15, surveillez l'application pendant un certain temps, puis n'exécutez kill -9 que si le processus ne s'est pas arrêté. Définissez un délai d'expiration d'arrêt gracieux adapté aux caractéristiques de vos tâches pour éviter un processus de libération excessivement lent.
Méthode 2 : Utiliser l'événement d'arrêt de Spring Boot
Pour les applications Spring Boot, utilisez Actuator pour déclencher l'arrêt gracieux via l'événement d'arrêt du conteneur Spring.
Ajoutez la dépendance Actuator à votre fichier
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Activez le point de terminaison d'arrêt :
management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=shutdown
Appelez le point de terminaison d'arrêt :
curl -X GET http://NodeIP:Port/actuator/shutdown
Méthode 3 : Utiliser l'interface HTTP de SchedulerX
Activez le serveur HTTP intégré de SchedulerX pour accepter les demandes d'arrêt provenant de systèmes externes.
Ajoutez la configuration suivante :
# Enable the HTTP service interface. Default: false.
spring.schedulerx2.httpServerEnable=true
# HTTP shutdown interface port. Default: 51886.
spring.schedulerx2.httpServerPort=51886
Appelez le point de terminaison HTTP suivant pour déclencher un arrêt gracieux :
curl -X GET http://NodeIP:51886/schedulerx/worker/shutdown
Intégrer l'arrêt gracieux aux flux de déploiement
Intégrez l'arrêt gracieux à votre processus de publication pour éviter l'interruption des tâches planifiées lors des redémarrages de l'application.
Intégration dans un processus de livraison continue (CD) personnalisé
Ajoutez la logique d'arrêt gracieux à l'étape d'arrêt de votre pipeline CD en utilisant l'une des trois méthodes de déclenchement.
Exemple de processus CD :
Le script suivant montre comment arrêter un processus applicatif avec un arrêt gracieux :
# After you start the application, the process ID is written into the app.pid file.
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: Specifies whether the current application process ends. You can configure the health field based on your business requirements.
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}
if
rm -rf ${PID}
echo "App(pid:${TARGET_PID}) stopped successful."
fi
Intégration dans un hook PreStop Kubernetes
Utilisez le hook de cycle de vie PreStop de Kubernetes pour déclencher un arrêt gracieux avant la suppression d'un pod. Deux approches sont possibles : les scripts exec et les requêtes HTTP.
Approche par script exec
Exécutez un script d'arrêt ou envoyez directement un signal 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"]
Approche par requête HTTP
Appelez le point de terminaison d'arrêt via une requête HTTP GET :
Pour les applications Spring Boot avec Actuator activé, définissez le chemin sur
/actuator/shutdown.Pour les applications non Spring, activez le serveur HTTP de SchedulerX et définissez le chemin sur
/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
Intégration avec les plateformes de déploiement Alibaba Cloud
Si vous déployez via Enterprise Distributed Application Service (EDAS) ou Microservices Engine (MSE) avec Container Service for Kubernetes (ACK), la plateforme gère automatiquement l'arrêt gracieux de SchedulerX une fois la fonctionnalité activée. Pour plus d'informations, consultez Arrêt gracieux des applications Spring Cloud et Arrêt gracieux.