Todos los productos
Search
Centro de documentos

Microservices Engine:Apagado graceful para tareas programadas

Última actualización: Sep 05, 2026

El apagado graceful garantiza que los trabajos de SchedulerX en ejecución finalicen antes de que el proceso de la aplicación termine durante un reinicio o redespliegue, lo cual evita el procesamiento incompleto de datos.

Diagrama de apagado graceful

imagen

Requisitos previos

La versión del cliente de SchedulerX debe ser 1.10.8 o posterior.

Configure el apagado graceful

SchedulerX admite el apagado graceful para trabajos en modo standalone y modo distributed. Dado que las tareas programadas pueden tardar mucho en completarse, establezca un tiempo de espera para evitar que los procesos de la aplicación esperen indefinidamente.

Agregue las siguientes propiedades a su configuración de 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

Modos de apagado

Modo

Comportamiento

WAIT_ALL (recomendado)

La aplicación termina solo después de que todos los trabajos y tareas de la aplicación se completen.

WAIT_RUNNING

La aplicación termina después de que finalicen los trabajos y tareas en ejecución a los que se les asignaron hilos. Los trabajos y tareas en cola se descartan.

Habilite el apagado graceful

Utilice uno de los tres métodos a continuación para habilitar el apagado graceful.

Método 1: Enviar una señal SIGTERM (kill -15)

Los SDK de SchedulerX registran un hook de apagado de JVM que activa automáticamente el apagado graceful. Envíe una señal SIGTERM al proceso de la aplicación:

kill -15 <Process ID>

El proceso espera a que los trabajos en ejecución finalicen según el modo de apagado y el tiempo de espera configurados, y luego termina.

Importante

No ejecute kill -9 directamente. Esta señal fuerza la terminación inmediata y omite el apagado graceful. En su lugar, ejecute primero kill -15, supervise la aplicación durante un período y luego ejecute kill -9 solo si el proceso no ha terminado. Establezca un tiempo de espera de apagado graceful adecuado según las características de sus trabajos para evitar un proceso de despliegue extremadamente lento.

Método 2: Usar el evento de apagado de Spring Boot

Para aplicaciones Spring Boot, utilice Actuator para habilitar el apagado graceful mediante el evento de apagado del contenedor Spring.

  1. Agregue la dependencia de Actuator a su archivo pom.xml:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  1. Habilite el endpoint de apagado:

management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=shutdown
  1. Llame al endpoint de apagado:

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

Método 3: Usar la interfaz HTTP de SchedulerX

Habilite el servidor HTTP integrado de SchedulerX para aceptar solicitudes de apagado desde sistemas externos.

  1. Agregue la siguiente configuración:

# Enable the HTTP service interface. Default: false.
spring.schedulerx2.httpServerEnable=true
# HTTP shutdown interface port. Default: 51886.
spring.schedulerx2.httpServerPort=51886

Llame al siguiente endpoint HTTP para habilitar un apagado graceful:

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

Integrar el apagado graceful en los flujos de trabajo de despliegue

Incorpore el apagado graceful a su proceso de despliegue para evitar que las tareas programadas se interrumpan durante los reinicios de la aplicación.

Integración en un proceso de entrega continua (CD) propio

Agregue la lógica de apagado graceful al paso de detención de su pipeline de CD mediante cualquiera de los tres métodos de activación.

Proceso de CD de ejemplo:

imagen

El siguiente script demuestra cómo detener un proceso de aplicación con apagado graceful:

# 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

Integración en un hook PreStop de Kubernetes

Utilice el hook de ciclo de vida PreStop de Kubernetes para habilitar el apagado graceful antes de que se termine un pod. Hay dos enfoques disponibles: scripts exec y solicitudes HTTP.

Enfoque de script exec

Ejecute un script de detención o envíe una señal SIGTERM directamente:

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

Enfoque de solicitud HTTP

Llame al endpoint de apagado mediante una solicitud HTTP GET:

  • Para aplicaciones Spring Boot con Actuator habilitado, establezca la ruta en /actuator/shutdown.

  • Para aplicaciones que no son de Spring, habilite el servidor HTTP de SchedulerX y establezca la ruta en /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

Integración con plataformas de despliegue de Alibaba Cloud

Si realiza el despliegue mediante Enterprise Distributed Application Service (EDAS) o Microservices Engine (MSE) con Container Service for Kubernetes (ACK), la plataforma gestiona automáticamente el apagado graceful de SchedulerX una vez que habilite la función. Para obtener más información, consulte Gracefully shut down Spring Cloud applications y Graceful shutdown.