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下线模式 | 描述 |
等待全部( | (推荐)该模式下,待所有已接收的任务(正在运行及队列中等待的任务)执行完成后,应用才退出。 |
等待运行中( | 该模式下,应用在退出时,将等待已分配线程并在处理中的执行记录完成,队列中的任务将被放弃执行。 |



