XXLJOB从2.2.0升级到2.4.0步骤

本文详细描述了如何从XXL-JOB2.2.0版本升级到2.4.0版本以修复CVE漏洞,涉及数据库表结构调整和新字段添加,以及配置文件更新和编译部署过程,强调备份重要性。

升级背景

检测到2.2.0版本xxl-job服务受如下2个漏洞影响,需要升级到2.4.0修复漏洞。

  1. 【修复】”CVE-2022-36157” 授权漏洞修复。
  2. 【修复】”CVE-2022-43183” SSRF漏洞修复。

关键点

根据运维经验和2.2.0版本搭建过程得知,升级版本需要考虑2个地方

  1. 数据库表结构
  2. 配置文件(src/main/resources/application.properties )

升级步骤

一. 通过比对工具,比对2个版本的初始化sql,整理升级差异sql。升级差异sql如下。

-- Table: `xxl_job_info`
ALTER TABLE `xxl_job_info` ADD COLUMN `schedule_type` varchar(50) NOT NULL DEFAULT 'NONE' COMMENT '调度类型' AFTER `alarm_email`;
ALTER TABLE `xxl_job_info` ADD COLUMN `schedule_conf` varchar(128) DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型' AFTER `schedule_type`;
ALTER TABLE `xxl_job_info` ADD COLUMN `misfire_strategy` varchar(50) NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略' AFTER `schedule_conf`;

-- 新增字段赋值
update `xxl_job_info` set  `schedule_type` = 'CRON';
update `xxl_job_info` set  `schedule_conf` = `job_cron`;


-- Table: `xxl_job_log_report`
ALTER TABLE `xxl_job_log_report` ADD `update_time` datetime DEFAULT NULL AFTER `fail_count`;

-- Table: `xxl_job_group`
ALTER TABLE `xxl_job_group` MODIFY `address_list` text COMMENT '执行器地址列表,多地址逗号分隔';
ALTER TABLE `xxl_job_group` ADD `update_time` datetime DEFAULT NULL AFTER `address_list`;


二. 2.2.0版本所在数据库执行上述升级差异sql

三. 将现正在运行的2.2.0版本的配置文件,拷贝到2.4.0版本配置文件目录下。配置文件目录:src/main/resources/application.properties,根据比对工具发现,只在2.2.0版本配置基础上增加3处即可。

升级差异配置

四. 在2.4.0版本源码目录重新编译生成jar包

进入目录:xxl-job-2.4.0/xxl-job-admin
使用如下编译命令,编译后,生成的2.4.0版本程序jar路径在:target/xxl-job-admin-2.4.0.jar

mvn clean install -Dmaven.test.skip=true

杀掉2.2.0版本程序,启动2.4.0版本程序。

ps -ef|grep xxl-job-admin-2.2.0.jar|grep -v grep|awk -F ' ' '{print $2}'|xargs kill -9
nohup java -jar xxl-job-admin-2.4.0.jar >> /dev/null 2>&1 &

升级完毕

重新登录控台首页,看到已经升级完毕。
在这里插入图片描述

后话

所有操作尽量有备份,例如2.2.0版本的数据库以及配置文件要有备份。

<think>问题:jobhandler[CheckTaskBuildJob]notfound原因分析:1.未在Spring容器中声明JobHandler的实现类2.实现类未添加@JobHandler注解(XXL-JOB旧版)或未使用@XxlJob注解(新版)3.方法名称与配置的jobHandler名称不一致4.项目包扫描问题,导致Bean未被加载解决方案:根据XXL-JOB版本不同,有两种方式注册JobHandler:一、XXL-JOB旧版(2.2.0之前)使用@JobHandler注解二、XXL-JOB新版(2.2.0+)推荐使用@XxlJob注解下面分别给出两种方式的解决方案代码:</think>## XXL-JOB "job handler not found" 问题解决方案 当出现 `job handler [CheckTaskBuildJob] not found` 错误时,表示 XXL-JOB 执行器无法找到对应的任务处理器。以下是完整的解决方案: ### 1. 基础JobHandler实现(推荐方案) ```java import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; import org.springframework.stereotype.Component; @Component public class CheckTaskBuildJobHandler { // 确保注解中的值与调度中心配置完全一致 @XxlJob("CheckTaskBuildJob") public void execute() throws Exception { // 获取任务参数 String param = XxlJobHelper.getJobParam(); try { // 业务逻辑实现 processTaskBuild(param); // 任务执行成功 XxlJobHelper.handleSuccess("任务执行成功"); } catch (Exception e) { // 任务执行失败 XxlJobHelper.handleFail("任务执行失败: " + e.getMessage()); throw e; } } private void processTaskBuild(String param) { // 具体的任务构建逻辑 System.out.println("处理任务构建,参数: " + param); // 这里添加您的业务代码... } } ``` ### 2. 配置扫描路径(关键步骤) 在 `application.yml` 中添加扫描配置: ```yaml xxl: job: executor: # 指定JobHandler所在的包路径 jobhandler: packages: com.yourcompany.job.handlers ``` ### 3. Bean扫描配置类 ```java import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class XxlJobConfig { @Value("${xxl.job.admin.addresses}") private String adminAddresses; @Value("${xxl.job.executor.appname}") private String appName; @Value("${xxl.job.executor.port}") private int port; @Bean public XxlJobSpringExecutor xxlJobExecutor() { XxlJobSpringExecutor executor = new XxlJobSpringExecutor(); executor.setAdminAddresses(adminAddresses); executor.setAppname(appName); executor.setPort(port); // 添加日志确认注册 System.out.println("==== XXL-JOB 执行器配置 ===="); System.out.println("Admin Addresses: " + adminAddresses); System.out.println("App Name: " + appName); System.out.println("Port: " + port); return executor; } } ``` ### 4. 诊断工具类 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.handler.annotation.XxlJob; import java.lang.reflect.Method; import java.util.Map; @Component public class JobHandlerDiagnostic { @Autowired private ApplicationContext applicationContext; public void printRegisteredJobHandlers() { System.out.println("==== 已注册的JobHandler列表 ===="); // 查找所有带@XxlJob注解的方法 Map<String, Object> beans = applicationContext.getBeansWithAnnotation(Component.class); beans.forEach((beanName, bean) -> { for (Method method : bean.getClass().getDeclaredMethods()) { if (method.isAnnotationPresent(XxlJob.class)) { XxlJob annotation = method.getAnnotation(XxlJob.class); System.out.println("JobHandler: " + annotation.value() + " | Class: " + bean.getClass().getName() + " | Method: " + method.getName()); } } }); // 查找所有JobHandler类型的Bean Map<String, IJobHandler> jobHandlers = applicationContext.getBeansOfType(IJobHandler.class); jobHandlers.forEach((name, handler) -> { System.out.println("JobHandler Bean: " + name + " | Class: " + handler.getClass().getName()); }); System.out.println("============================"); } } ``` ### 5. 启动时自动诊断 ```java import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class JobApplication { @Autowired private JobHandlerDiagnostic diagnostic; public static void main(String[] args) { SpringApplication.run(JobApplication.class, args); } @PostConstruct public void init() { // 应用启动时打印注册的JobHandler diagnostic.printRegisteredJobHandlers(); } } ``` ### 问题排查步骤 1. **检查注解匹配** - 确认`@XxlJob("CheckTaskBuildJob")`中的名称与调度中心配置**完全一致**(大小写敏感) - 使用诊断工具输出所有注册的JobHandler名称 2. **包扫描路径验证** - 确保`application.yml`中的`xxl.job.executor.jobhandler.packages`包含JobHandler类所在的包 - 路径格式:`com.yourcompany.job.handlers` 3. **Spring Bean检查** - JobHandler类必须有`@Component`注解 - 确认类在Spring的组件扫描路径内 4. **方法签名验证** - 任务处理方法必须为`public`方法 - 方法不能有参数(或只能有特定参数) - 返回类型应为`void` 5. **版本兼容性检查** - 确保XXL-JOB核心版本一致 - 检查依赖: ```xml <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.4.0</version> <!-- 使用最新版本 --> </dependency> ``` ### 常见错误场景及修复 **场景1:大小写不匹配** 调度中心配置:`checktaskbuildjob` 代码注解:`@XxlJob("CheckTaskBuildJob")` **修复**:统一为完全相同的名称(推荐全小写) **场景2:缺少组件注解** ```java // 缺少@Component注解 public class CheckTaskBuildJobHandler { @XxlJob("CheckTaskBuildJob") public void execute() {...} } ``` **修复**:添加`@Component`或`@Service`注解 **场景3:包扫描未配置** ```yaml # 缺少包扫描配置 xxl: job: executor: # 没有指定packages属性 ``` **修复**:添加`jobhandler.packages`配置 **场景4:方法签名错误** ```java @XxlJob("CheckTaskBuildJob") private void execute() {...} // 不能是private ``` **修复**:改为`public void` ### 高级调试技巧 1. 在调度中心手动触发任务,查看执行器日志: ``` >>>>>>>>>>> xxl-job regist job handler success, name:CheckTaskBuildJob, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler ``` 2. 启用XXL-JOB的远程调试: ```java // 在配置类中添加 executor.setLogRetentionDays(30); // 保留日志天数 ``` 3. 检查网络连通性: ```bash # 从执行器服务器测试连接调度中心 curl -v http://xxl-job-admin:8080/xxl-job-admin ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

于特洛夫斯基

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值