Tous les produits
Search
Centre de documentation

Microservices Engine:Arrêt gracieux des tâches planifiées

Dernière mise à jour :Aug 11, 2026

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

image

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

WAIT_ALL (recommandé)

L'application ne s'arrête qu'une fois toutes les tâches et tous les jobs terminés.

WAIT_RUNNING

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.

Important

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.

  1. Ajoutez la dépendance Actuator à votre fichier pom.xml :

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  1. Activez le point de terminaison d'arrêt :

management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=shutdown
  1. 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.

  1. 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 :

image

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.