O desligamento gracioso garante a conclusão dos jobs do SchedulerX em execução antes do término do processo da aplicação durante uma reinicialização ou reimplantação, evitando o processamento incompleto de dados.
Diagrama de desligamento gracioso

Pré-requisitos
A versão do cliente SchedulerX deve ser 1.10.8 ou posterior.
Configure o desligamento gracioso
O SchedulerX oferece suporte ao desligamento gracioso para jobs nos modos standalone e distributed. Como os jobs agendados podem demorar para concluir, defina um timeout para evitar que os processos da aplicação aguardem indefinidamente.
Adicione as seguintes propriedades à configuração do 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 desligamento
|
Modo |
Comportamento |
|
|
A aplicação encerra somente após a conclusão de todos os jobs e tarefas nela contidos. |
|
|
A aplicação encerra após a conclusão dos jobs e tarefas em execução com threads alocados. Jobs e tarefas na fila são descartados. |
Acionar o desligamento gracioso
Use um dos três métodos a seguir para acionar o desligamento gracioso.
Método 1: Enviar um sinal SIGTERM (kill -15)
Os SDKs do SchedulerX registram um hook de desligamento da JVM que aciona o desligamento gracioso automaticamente. Envie um sinal SIGTERM para o processo da aplicação:
kill -15 <Process ID>
O processo aguarda a conclusão dos jobs em execução conforme o modo de desligamento e o timeout configurados e, em seguida, encerra.
Não execute kill -9 diretamente. Esse sinal força o término imediato e ignora o desligamento gracioso. Em vez disso, execute primeiro kill -15, monitore a aplicação por um período e execute kill -9 apenas se o processo não tiver sido encerrado. Defina um timeout de desligamento gracioso adequado às características dos seus jobs para evitar um processo de liberação extremamente lento.
Método 2: Usar o evento de desligamento do Spring Boot
Para aplicações Spring Boot, use o Actuator para acionar o desligamento gracioso por meio do evento de desligamento do contêiner Spring.
Adicione a dependência do Actuator ao arquivo
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Ative o endpoint de desligamento:
management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=shutdown
Chame o endpoint de desligamento:
curl -X GET http://NodeIP:Port/actuator/shutdown
Método 3: Usar a interface HTTP do SchedulerX
Ative o servidor HTTP integrado do SchedulerX para aceitar solicitações de desligamento de sistemas externos.
Adicione a seguinte configuração:
# Enable the HTTP service interface. Default: false.
spring.schedulerx2.httpServerEnable=true
# HTTP shutdown interface port. Default: 51886.
spring.schedulerx2.httpServerPort=51886
Chame o seguinte endpoint HTTP para acionar um desligamento gracioso:
curl -X GET http://NodeIP:51886/schedulerx/worker/shutdown
Integrar o desligamento gracioso aos fluxos de trabalho de implantação
Incorpore o desligamento gracioso ao processo de release para evitar interrupções de jobs agendados durante reinicializações da aplicação.
Integrar a um processo de entrega contínua (CD) próprio
Adicione a lógica de desligamento gracioso à etapa de parada do pipeline de CD usando qualquer um dos três métodos de acionamento.
Exemplo de processo de CD:
O script a seguir demonstra como parar um processo de aplicação com desligamento gracioso:
# 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
Integrar a um hook PreStop do Kubernetes
Use o hook de ciclo de vida PreStop do Kubernetes para acionar o desligamento gracioso antes do término de um pod. Duas abordagens estão disponíveis: scripts exec e requisições HTTP.
Abordagem com script exec
Execute um script de parada ou envie um sinal SIGTERM diretamente:
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"]
Abordagem com requisição HTTP
Chame o endpoint de desligamento por meio de uma requisição HTTP GET:
Para aplicações Spring Boot com o Actuator ativado, defina o caminho como
/actuator/shutdown.Para aplicações que não usam Spring, ative o servidor HTTP do SchedulerX e defina o caminho como
/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
Integrar às plataformas de implantação da Alibaba Cloud
Se você implantar por meio do Enterprise Distributed Application Service (EDAS) ou do Microservices Engine (MSE) com o Container Service for Kubernetes (ACK), a plataforma gerencia o desligamento gracioso do SchedulerX automaticamente após a ativação do recurso. Para obter mais informações, consulte Desligar aplicações Spring Cloud graciosamente e Desligamento gracioso.