xxljob升级方案

19

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版本更新了该方法,使得默认任务结果为 "成功" 状态,不需要主动设置,于是,修改方法的返回值ReturnTvoid,删除掉其原先的结果返回,修改为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();                 // 设置任务结果
}

具体处理的jira页面

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 xxl_job_info 1. job_cron
2. schedule_type
3. schedule_conf
4. misfire_strategy
5. trigger_status
6. trigger_last_time
7. trigger_next_time
删除
新增
新增
新增
新增
新增
新增
cron表达式
调度类型(CRON)
调度配置(cron表达式)
调度过期策略(DO_NOTHING)
触发器状态(0, 1)
上次调度时间(重启后生成)
下次调度时间(重启后生成)
xxl_job_qrtz_trigger_log xxl_job_log 1. id
2. alarm_status
3. i_handle_code(索引)
修改
新增
新增
主键类型改为long
告警状态(0)

xxl_job_log_report 1. id
2. trigger_day
3. running_count
4. suc_count
5. fail_count
6. update_time
新增 主键
调度-时间(NULL)
运行中-日志数量('0')
执行成功-日志数量('0')
执行失败-日志数量('0')
更新时间(NULL)
xxl_job_qrtz_trigger_logglue xxl_job_logglue 1. add_time
2. update_time
修改
修改
类型从timestamp改为datetime
类型从timestamp改为datetime
xxl_job_qrtz_trigger_registry xxl_job_registry 1. update_time
2. i_g_k_v(索引)
修改
新增
类型从timestamp改为datetime

xxl_job_qrtz_trigger_group xxl_job_group 1. order
2. update_time
删除
新增
排序
更新时间(NULL)
xxl_job_user 1. id
2. username
3. password
4. role
5. permission
新增 主键
账号(admin)
密码(123456)
角色:0-普通用户、1-管理员
权限:执行器ID列表,多个逗号分割(NULL)
xxl_job_qrtz_locks xxl_job_lock 1. SCHED_NAME
2. LOCK_NAME
删除
修改
计划名称
锁名称,修改为lock_name
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

    1. job_cron列被新表的schedule_typeschedule_conf调度类型和调度配置替换,故将job_cron中的数据迁移到新表的两列中type为CRON,conf为原先的cron表达式
    1. 表中新增调度过期策略misfire_strategy列,对应XXL_JOB_QRTZ_TRIGGERS表中MISFIRE_INSTR列,对应设置为DO_NOTHING quartz过期处理策略
    1. 表中trigger_status列默认为0,更新后需要手动触发启动一下服务以此更新数据
    1. 表中trigger_next_time****trigger_next_time两列会在服务启动的时候自动更新,后续启动完成之后检查数据

xxl_job_qrtz_trigger_group

    1. order列在新版本被弃用,原先在界面展示执行器顺序是按照order字段的值进行排序 ORDER BY t.order ASC,现在按照 ORDER BY t.app_name, t.title, t.id ASC
    1. 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版本更新了该方法,使得默认任务结果为 "成功" 状态,不需要主动设置,于是,修改方法的返回值ReturnTvoid,删除掉其原先的结果返回,修改为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();                 // 设置任务结果
}

具体处理的jira页面

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 xxl_job_info 1. job_cron
2. schedule_type
3. schedule_conf
4. misfire_strategy
5. trigger_status
6. trigger_last_time
7. trigger_next_time
删除
新增
新增
新增
新增
新增
新增
cron表达式
调度类型(CRON)
调度配置(cron表达式)
调度过期策略(DO_NOTHING)
触发器状态(0, 1)
上次调度时间(重启后生成)
下次调度时间(重启后生成)
xxl_job_qrtz_trigger_log xxl_job_log 1. id
2. alarm_status
3. i_handle_code(索引)
修改
新增
新增
主键类型改为long
告警状态(0)

xxl_job_log_report 1. id
2. trigger_day
3. running_count
4. suc_count
5. fail_count
6. update_time
新增 主键
调度-时间(NULL)
运行中-日志数量('0')
执行成功-日志数量('0')
执行失败-日志数量('0')
更新时间(NULL)
xxl_job_qrtz_trigger_logglue xxl_job_logglue 1. add_time
2. update_time
修改
修改
类型从timestamp改为datetime
类型从timestamp改为datetime
xxl_job_qrtz_trigger_registry xxl_job_registry 1. update_time
2. i_g_k_v(索引)
修改
新增
类型从timestamp改为datetime

xxl_job_qrtz_trigger_group xxl_job_group 1. order
2. update_time
删除
新增
排序
更新时间(NULL)
xxl_job_user 1. id
2. username
3. password
4. role
5. permission
新增 主键
账号(admin)
密码(123456)
角色:0-普通用户、1-管理员
权限:执行器ID列表,多个逗号分割(NULL)
xxl_job_qrtz_locks xxl_job_lock 1. SCHED_NAME
2. LOCK_NAME
删除
修改
计划名称
锁名称,修改为lock_name
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

    1. job_cron列被新表的schedule_typeschedule_conf调度类型和调度配置替换,故将job_cron中的数据迁移到新表的两列中type为CRON,conf为原先的cron表达式
    1. 表中新增调度过期策略misfire_strategy列,对应XXL_JOB_QRTZ_TRIGGERS表中MISFIRE_INSTR列,对应设置为DO_NOTHING quartz过期处理策略
    1. 表中trigger_status列默认为0,更新后需要手动触发启动一下服务以此更新数据
    1. 表中trigger_next_time****trigger_next_time两列会在服务启动的时候自动更新,后续启动完成之后检查数据

xxl_job_qrtz_trigger_group

    1. order列在新版本被弃用,原先在界面展示执行器顺序是按照order字段的值进行排序 ORDER BY t.order ASC,现在按照 ORDER BY t.app_name, t.title, t.id ASC
    1. 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张数据库表说明