xxljob升级方案
xxljob版本升级方案
1、概要
1.1 目的
现在项目中xxljob版本2.0.1过低,会在进行Xray安全扫描的时候出现漏洞。为了处理上述Xray漏洞,现将协同服务,平台服务,流水线服务,upms服务的xxljob版本从2.0.1升级到2.4.1
1.2 Xray扫描漏洞
- XXL-Job 在 v2.3.1 版本之前存在一个服务器端请求伪造(SSRF)漏洞,该漏洞通过组件 /admin/controller/JobLogController.java 被利用。
- XXL-JOB在2.2.0及其之前版本,在后台任务中存在命令执行漏洞。这个漏洞允许攻击者在后台任务中心通过写入shell命令任务调度来获取服务器权限。
2、升级内容
2.1 客户端代码处理
- 依赖更新:修改pom文件,重新添加xxl-job-core2.4.1版本依赖。
- 配置文件调整:在XxlJobConfig.java文件中修改xxlJobSpringExecutor的方法名setAppName()为setAppname(),添加配置address。
- 处理Handler文件:在2.4.1版本中,xxljob移除了基于类的开发方式,移除了@JobHandler注解和IJobHandler类,并引入了基于方法的开发方式,每个任务对应一个方法,引入了@XxlJob注解。
- 注解变更:删除Handler文件中的@JobHandler注解,取消继承IJobHandler类,并且在execute方法上添加@XxlJob注解,支持自动扫描任务并注入到执行器容器。
- 方法变更:重构execute方法:2.4.1版本更新了该方法,使得默认任务结果为 "成功" 状态,不需要主动设置,于是,修改方法的返回值ReturnT
为void ,删除掉其原先的结果返回,修改为XxlJobHelper.handleFail/handleSuccess自主设置返回结果。 - 日志处理:修改日志处理:修改原先的XxlJobLogger.log()为XxlJobHelper.log()
- 执行器初始化修改:在低版本的xxl-job中,初始化 XxlJobSpringExecutor执行器需要在@Bean中加上
initMethod = "start", destroyMethod = "destroy"
,但是在高版本的xxl-job(如 2.2.0)则需要删除initMethod = "start", destroyMethod = "destroy"
- 参数获取方式修改:
/**【优化】任务核心类 “IJobHandler” 的 “execute” 方法取消出入参设计。改为通过 “XxlJobHelper.getJobParam” 获取任务参数并替代方法入参,通过 “XxlJobHelper.handleSuccess/handleFail” 设置任务结果并替代方法出参,示例代码如下;**/
@XxlJob("demoJobHandler")
public void execute() {
String param = XxlJobHelper.getJobParam(); // 获取参数
XxlJobHelper.handleSuccess(); // 设置任务结果
}
2.2 数据库更新
2.4.1版本对数据库表有所修改
- 通过mysqldump工具导出原先的数据库以作备份处理,比对2个版本的sql文件,整理差异,并编写更新脚本update.sql文件update.sql
- 本地测试:在本地数据库测试更新,回滚等操作,确保没有问题后,再到生产环境更新。
- 更新步骤:
- 先使用
mysqldump -uroot -p --host=[ip] --port=[端口] --databases --add-locks --no-autocommit paas_basic_task > [path_to_sql_file.sql备份文件]
命令导出备份文件 - 运行update.sql文件,确认文件运行没问题
- 如果有问题使用
mysql -u [username] -p[password] paas_basic_task < [path_to_sql_file.sql备份文件]
命令回滚到之前版本
- 先使用
2.2.1 数据库:数据迁移
数据库更新前后表对比
旧表 | 新表 | 修改列(索引) | 处理 | 描述(默认值) |
---|---|---|---|---|
xxl_job_qrtz_trigger_info |
1. 2. 3. 4. 5. 6. 7. |
|
|
|
1. 2. 3. |
|
|
||
1. 2. 3. 4. 5. 6. |
新增 |
|
||
1. 2. |
|
|
||
xxl_job_qrtz_trigger_registry | xxl_job_registry |
1. 2. |
|
|
xxl_job_qrtz_trigger_group | xxl_job_group |
1. 2. |
|
|
xxl_job_user |
1. 2. 3. 4. 5. |
新增 |
|
|
xxl_job_qrtz_locks | xxl_job_lock |
1. 2. |
|
|
xxl_job_qrtz_blob_triggers | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_calendars | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_cron_triggers | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_fired_triggers | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_paused_trigger_grps | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_scheduler_state | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_simple_triggers | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_simprop_triggers | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_triggers | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_job_details | 删除 | quartz需要的表,新版本该组件被去掉 |
xxl_job_qrtz_trigger_info
-
- job_cron列被新表的schedule_type和schedule_conf调度类型和调度配置替换,故将job_cron中的数据迁移到新表的两列中type为CRON,conf为原先的cron表达式
-
- 表中新增调度过期策略misfire_strategy列,对应XXL_JOB_QRTZ_TRIGGERS表中MISFIRE_INSTR列,对应设置为DO_NOTHING quartz过期处理策略
-
- 表中trigger_status列默认为0,更新后需要手动触发启动一下服务以此更新数据
-
- 表中trigger_next_time****trigger_next_time两列会在服务启动的时候自动更新,后续启动完成之后检查数据
xxl_job_qrtz_trigger_group
-
- order列在新版本被弃用,原先在界面展示执行器顺序是按照order字段的值进行排序
ORDER BY t.order ASC
,现在按照ORDER BY t.app_name, t.title, t.id ASC
- order列在新版本被弃用,原先在界面展示执行器顺序是按照order字段的值进行排序
-
- update_time列是新版本新增的记录执行器更新时间的字段,调用"/update"或者"/save"接口成功会将其设置为当前日期和时间。
xxl_job_user
- 新版本新增用户管理:支持在线管理系统用户,存在管理员、普通用户两种角色;默认初始插入一条数据admin以保证初始登录
xxl_job_qrtz_locks
- 新版本删除了SCHED_NAME列,但是需要添加数据'schedule_lock'以此确保调度操作的唯一性,防止其他调度进程同时执行。
2.3 配置文件升级
项目使用远程配置,根据新版本2.4.1的配置文件对现有的旧配置更新,删除不生效的配置,并保留原先旧配置以作备份。
2.3.1 服务端配置文件升级
使用新版本配置对旧版本替换更新
配置 | 处理 |
---|---|
management.server.servlet.context-path=/actuator | 新增 |
management.health.mail.enabled=false | 新增 |
spring.mvc.servlet.load-on-startup=0 | 新增 |
spring.freemarker.settings.new_builtin_class_resolver=safer | 新增 |
连接池配置 | 从tomcat的JDBC连接池替换成了HikariCP,并且将最大连接数修改为300 |
email配置 | 从xxl.job.mail修改为spring.email,内容对应修改 |
登录配置 | 删除,新版本添加了用户管理,用户数据存入数据库 |
xxl.job.accessToken=default_token | 修改 |
xxl.job.i18n=zh_CN | 修改 |
xxl.job.triggerpool.fast.max=200 | 新增 |
xxl.job.triggerpool.slow.max=100 | 新增 |
xxl.job.logretentiondays=30 | 新增 |
2.3.2 客户端配置文件升级
使用新版本配置对旧版本替换更新
- 添加配置,xxl.job.executor.address=
2.4 服务端升级
对项目原先task库中的xxl-job-admin控制台代码进行更新,使用2.4.1版本对比,之后进行替换处理,并对原先代码进行备份,确保无误后在提交入库
3、测试
使用本地配置文件运行xxl-job-admin以作测试。在本地启动devops的各个模块,具体测试,查看是否有数据遗漏,以及任务是否被成功注入添加。确保没有问题之后,再正式上线操作。
4、检查
- 对更新后的系统功能进行检查,观察定时任务能否顺利触发,调度能否顺利完成
4、参考文档
xxljob官方文档
XXLJOB从2.2.0升级到2.4.0步骤
xxl-job版本升级客户端详解
xxl-job版本升级
quartz过期处理策略
Quartz的12张数据库表说明
xxljob版本升级方案
1、概要
1.1 目的
现在项目中xxljob版本2.0.1过低,会在进行Xray安全扫描的时候出现漏洞。为了处理上述Xray漏洞,现将协同服务,平台服务,流水线服务,upms服务的xxljob版本从2.0.1升级到2.4.1
1.2 Xray扫描漏洞
- XXL-Job 在 v2.3.1 版本之前存在一个服务器端请求伪造(SSRF)漏洞,该漏洞通过组件 /admin/controller/JobLogController.java 被利用。
- XXL-JOB在2.2.0及其之前版本,在后台任务中存在命令执行漏洞。这个漏洞允许攻击者在后台任务中心通过写入shell命令任务调度来获取服务器权限。
2、升级内容
2.1 客户端代码处理
- 依赖更新:修改pom文件,重新添加xxl-job-core2.4.1版本依赖。
- 配置文件调整:在XxlJobConfig.java文件中修改xxlJobSpringExecutor的方法名setAppName()为setAppname(),添加配置address。
- 处理Handler文件:在2.4.1版本中,xxljob移除了基于类的开发方式,移除了@JobHandler注解和IJobHandler类,并引入了基于方法的开发方式,每个任务对应一个方法,引入了@XxlJob注解。
- 注解变更:删除Handler文件中的@JobHandler注解,取消继承IJobHandler类,并且在execute方法上添加@XxlJob注解,支持自动扫描任务并注入到执行器容器。
- 方法变更:重构execute方法:2.4.1版本更新了该方法,使得默认任务结果为 "成功" 状态,不需要主动设置,于是,修改方法的返回值ReturnT
为void ,删除掉其原先的结果返回,修改为XxlJobHelper.handleFail/handleSuccess自主设置返回结果。 - 日志处理:修改日志处理:修改原先的XxlJobLogger.log()为XxlJobHelper.log()
- 执行器初始化修改:在低版本的xxl-job中,初始化 XxlJobSpringExecutor执行器需要在@Bean中加上
initMethod = "start", destroyMethod = "destroy"
,但是在高版本的xxl-job(如 2.2.0)则需要删除initMethod = "start", destroyMethod = "destroy"
- 参数获取方式修改:
/**【优化】任务核心类 “IJobHandler” 的 “execute” 方法取消出入参设计。改为通过 “XxlJobHelper.getJobParam” 获取任务参数并替代方法入参,通过 “XxlJobHelper.handleSuccess/handleFail” 设置任务结果并替代方法出参,示例代码如下;**/
@XxlJob("demoJobHandler")
public void execute() {
String param = XxlJobHelper.getJobParam(); // 获取参数
XxlJobHelper.handleSuccess(); // 设置任务结果
}
2.2 数据库更新
2.4.1版本对数据库表有所修改
- 通过mysqldump工具导出原先的数据库以作备份处理,比对2个版本的sql文件,整理差异,并编写更新脚本update.sql文件update.sql
- 本地测试:在本地数据库测试更新,回滚等操作,确保没有问题后,再到生产环境更新。
- 更新步骤:
- 先使用
mysqldump -uroot -p --host=[ip] --port=[端口] --databases --add-locks --no-autocommit paas_basic_task > [path_to_sql_file.sql备份文件]
命令导出备份文件 - 运行update.sql文件,确认文件运行没问题
- 如果有问题使用
mysql -u [username] -p[password] paas_basic_task < [path_to_sql_file.sql备份文件]
命令回滚到之前版本
- 先使用
2.2.1 数据库:数据迁移
数据库更新前后表对比
旧表 | 新表 | 修改列(索引) | 处理 | 描述(默认值) |
---|---|---|---|---|
xxl_job_qrtz_trigger_info |
1. 2. 3. 4. 5. 6. 7. |
|
|
|
1. 2. 3. |
|
|
||
1. 2. 3. 4. 5. 6. |
新增 |
|
||
1. 2. |
|
|
||
xxl_job_qrtz_trigger_registry | xxl_job_registry |
1. 2. |
|
|
xxl_job_qrtz_trigger_group | xxl_job_group |
1. 2. |
|
|
xxl_job_user |
1. 2. 3. 4. 5. |
新增 |
|
|
xxl_job_qrtz_locks | xxl_job_lock |
1. 2. |
|
|
xxl_job_qrtz_blob_triggers | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_calendars | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_cron_triggers | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_fired_triggers | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_paused_trigger_grps | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_scheduler_state | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_simple_triggers | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_simprop_triggers | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_triggers | 删除 | quartz需要的表,新版本该组件被去掉 | ||
xxl_job_qrtz_job_details | 删除 | quartz需要的表,新版本该组件被去掉 |
xxl_job_qrtz_trigger_info
-
- job_cron列被新表的schedule_type和schedule_conf调度类型和调度配置替换,故将job_cron中的数据迁移到新表的两列中type为CRON,conf为原先的cron表达式
-
- 表中新增调度过期策略misfire_strategy列,对应XXL_JOB_QRTZ_TRIGGERS表中MISFIRE_INSTR列,对应设置为DO_NOTHING quartz过期处理策略
-
- 表中trigger_status列默认为0,更新后需要手动触发启动一下服务以此更新数据
-
- 表中trigger_next_time****trigger_next_time两列会在服务启动的时候自动更新,后续启动完成之后检查数据
xxl_job_qrtz_trigger_group
-
- order列在新版本被弃用,原先在界面展示执行器顺序是按照order字段的值进行排序
ORDER BY t.order ASC
,现在按照ORDER BY t.app_name, t.title, t.id ASC
- order列在新版本被弃用,原先在界面展示执行器顺序是按照order字段的值进行排序
-
- update_time列是新版本新增的记录执行器更新时间的字段,调用"/update"或者"/save"接口成功会将其设置为当前日期和时间。
xxl_job_user
- 新版本新增用户管理:支持在线管理系统用户,存在管理员、普通用户两种角色;默认初始插入一条数据admin以保证初始登录
xxl_job_qrtz_locks
- 新版本删除了SCHED_NAME列,但是需要添加数据'schedule_lock'以此确保调度操作的唯一性,防止其他调度进程同时执行。
2.3 配置文件升级
项目使用远程配置,根据新版本2.4.1的配置文件对现有的旧配置更新,删除不生效的配置,并保留原先旧配置以作备份。
2.3.1 服务端配置文件升级
使用新版本配置对旧版本替换更新
配置 | 处理 |
---|---|
management.server.servlet.context-path=/actuator | 新增 |
management.health.mail.enabled=false | 新增 |
spring.mvc.servlet.load-on-startup=0 | 新增 |
spring.freemarker.settings.new_builtin_class_resolver=safer | 新增 |
连接池配置 | 从tomcat的JDBC连接池替换成了HikariCP,并且将最大连接数修改为300 |
email配置 | 从xxl.job.mail修改为spring.email,内容对应修改 |
登录配置 | 删除,新版本添加了用户管理,用户数据存入数据库 |
xxl.job.accessToken=default_token | 修改 |
xxl.job.i18n=zh_CN | 修改 |
xxl.job.triggerpool.fast.max=200 | 新增 |
xxl.job.triggerpool.slow.max=100 | 新增 |
xxl.job.logretentiondays=30 | 新增 |
2.3.2 客户端配置文件升级
使用新版本配置对旧版本替换更新
- 添加配置,xxl.job.executor.address=
2.4 服务端升级
对项目原先task库中的xxl-job-admin控制台代码进行更新,使用2.4.1版本对比,之后进行替换处理,并对原先代码进行备份,确保无误后在提交入库
3、测试
使用本地配置文件运行xxl-job-admin以作测试。在本地启动devops的各个模块,具体测试,查看是否有数据遗漏,以及任务是否被成功注入添加。确保没有问题之后,再正式上线操作。
4、检查
- 对更新后的系统功能进行检查,观察定时任务能否顺利触发,调度能否顺利完成
4、参考文档
xxljob官方文档
XXLJOB从2.2.0升级到2.4.0步骤
xxl-job版本升级客户端详解
xxl-job版本升级
quartz过期处理策略
Quartz的12张数据库表说明