Todos os produtos
Search
Central de documentação

Microservices Engine:Desligamento gracioso para jobs agendados

Última atualização: Jun 28, 2026

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

image

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

WAIT_ALL (recomendado)

A aplicação encerra somente após a conclusão de todos os jobs e tarefas nela contidos.

WAIT_RUNNING

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.

Importante

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.

  1. Adicione a dependência do Actuator ao arquivo pom.xml:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  1. Ative o endpoint de desligamento:

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

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

image

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.