MSE XXL-JOB在相容開源版本基礎上新增優雅下線功能:應用關閉前首先通知調度服務端摘流停止新任務派發,待存量任務執行完畢後再安全下線應用,實現業務無損重啟。本文旨在為您介紹如何基於阿里雲任務調度XXL-JOB版開啟優雅下線功能,協助您處理實際業務重啟或下線的情境。
定時任務優雅下線概述
在實際業務中,應用進程內的定時任務會持續按固定頻率執行。當應用發布重啟時,運行中的定時任務將被強制中斷,可能導致資料不完整和調度成功率驟降,最終出現業務資料受損。主要存在以下情況:
任務執行中斷:任務正在運行中,應用進程停機業務處理中斷,可能會導致業務資料不完整。
任務調度下跌:在發布重啟過程中,調度器將任務分發給停機節點,導致調度失敗影響整體處理效率。
因此,在使用定時任務調度的情境下,需要定時任務優雅下線,以實現滾動發布和重啟過程中的業務平滑運行。
基於開源XXL-JOB優雅下線實踐
前提條件
引擎版本需2.1.0及以上。版本詳情,請參見XXL-JOB引擎版本。
用戶端需接入SchedulerX plugin包。版本詳情,請參見XXL-JOB外掛程式版本。
<dependency> <groupId>com.aliyun.schedulerx</groupId> <artifactId>schedulerx3-plugin-xxljob</artifactId> <version>最新版本</version> </dependency>
如何啟用優雅下線
在不同的業務形態和部署情境中,完整配置並啟用優雅下線方案。該過程主要包括兩個步驟:
步驟一:執行器各架構初始化整合
業務應用不同的部署形態,需要按不同方式進行初始化整合。
形態一:SpringBoot業務應用(推薦)
如果業務應用採用了SpringBoot方式整合XXL-Job的執行器,那麼可自動完成相應的優雅下線能力初始化整合。只需完成如下兩個步驟即可:
添加SchedulerX外掛程式Maven依賴。版本詳情,請參見XXL-JOB外掛程式版本。
<dependency> <groupId>com.aliyun.schedulerx</groupId> <artifactId>schedulerx3-plugin-xxljob</artifactId> <version>最新版本</version> </dependency>添加應用配置參數,開啟優雅下線。詳細參數說明,請參見配置參數說明。
# 配置優雅下線 xxl.job.executor.shutdownMode=WAIT_ALL
形態二:Spring業務應用
如果業務應用是通過Spring架構啟動的Web應用,除了添加POM依賴和應用啟動參數(參考形態一:SpringBoot業務應用(推薦)),還需通過初始化配置XxlJobExecutorEnhancerInitializer,在web.xml中添加如下配置:
<web-app>
<context-param>
<!-- Spring ApplicationContextInitializer 增強xxljob executor功能 -->
<param-name>globalInitializerClasses</param-name>
<param-value>com.aliyun.schedulerx.xxljob.enhance.XxlJobExecutorEnhancerInitializer</param-value>
</context-param>
</web-app>形態三:Frameless Java業務應用
如果業務應用採用xxl-job executor案例中的Frameless方式,通過純Java編碼方式啟動業務應用時,可通過自訂編碼完成優雅下線功能初始化整合。首先業務應用還是需要添加POM依賴和應用啟動參數(參考形態一:SpringBoot業務應用(推薦)),相關參考案例如下:
Executor啟動前,添加:
EnhancerLoader.load(xxlJobProp),完成功能增強載入。Executor啟動前,添加:
Runtime.getRuntime().addShutdownHook(...),為當前應用添加下線Hook實現。
步驟二:應用停機下線處理
自建部署,通過kill -15停機
在自建CD流程中通常會有一個應用進程停止的節點,該節點可通過構建一個stop.sh 指令碼用於應用進程停止退出。指令碼內容需包含應用優雅下線的相關邏輯處理,參考如下停機指令碼。
K8s容器化部署,通過PreStop停機
利用k8s pod的生命週期管理可預設實現優雅下線。同時還可以使用preStop hook,通過exec執行指令碼和HTTP請求方式來實現優雅下線邏輯處理。
預設無效修改:如果業務應用進程為容器中的主進程PID 1,則預設會先給主進程發送SIGTERM訊號進行優雅下線。
自訂preStop:如容器內為複雜的多進程關係,可通過配置preStop指令碼,自訂通過
kill -15 PID停止應用進程,或者調用提前預設的stop.sh指令碼實現應用進程退出。
方案中Pod的terminationGracePeriodSeconds參數會控制優雅下線的整體最長等待時間(預設30s),需要按業務需要合理配置。
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", "指令碼路徑/stop.sh"]阿里雲上應用發布平台自動整合
敬請期待。
配置參數說明
在業務應用中需要配置如下參數開啟優雅下線功能,並且支援通過該參數配置兩種不同的優雅下線策略。
# 優雅下線模式,WAIT_ALL:等待全部; WAIT_RUNNING:等待運行中。
# 該參數不配置,則表示保持XXL-JOB原始邏輯不變(預設不開啟優雅下線)。
xxl.job.executor.shutdownMode=WAIT_ALL下線模式 | 描述 |
等待全部( | (推薦)該模式下,待所有已接收的任務(正在運行及隊列中等待的任務)執行完成後,應用才退出。 |
等待運行中( | 該模式下,應用在退出時,將等待已指派線程並在處理中的執行記錄完成,隊列中的任務將被放棄執行。 |



