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

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 |
|
|
La aplicación termina solo después de que todos los trabajos y tareas de la aplicación se completen. |
|
|
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.
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.
Agregue la dependencia de Actuator a su archivo
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Habilite el endpoint de apagado:
management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=shutdown
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.
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:
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.