xxl-job任务调度2.0.2升级到2.3.0版本,执行器改造过程中经验总结

news/2024/5/18 23:37:03 标签: java, 任务调度, xxl-job, 执行器, 版本升级

xxl-job任务调度2.0.2升级到2.3.0版本

  • 一、背景
  • 二、开始改造
    • 1、修改pom.xml
    • 2、修改Handler
    • 3、启动服务并验证
    • 4、解决异常
    • 5、再次启动服务并验证

一、背景

现在要对一批老项目中的执行器进行升级,原来老项目中的执行器,依赖的任务调度中心xxl-job版本是2.0.2-SNAPSHOT版本,现在要依赖2.3.0版本的xxl-job任务调度中心

二、开始改造

老项目的执行器,使用的是spring版本,需要tomcat来启动服务,这里拿一个纯净的spring项目来演示,具体如下:
在这里插入图片描述

1、修改pom.xml

打开pom.xml文件,原文件是这样的
在这里插入图片描述
如下:

<parent>
		<groupId>com.xuxueli</groupId>
		<artifactId>xxl-job-executor-samples</artifactId>
		<version>2.0.2-SNAPSHOT</version>
	</parent>

修改执行器依赖xxl-job-core的版本,改为2.3.0版本
在这里插入图片描述
如下:

<parent>
		<groupId>com.xuxueli</groupId>
		<artifactId>xxl-job-executor-samples</artifactId>
		<version>2.3.0</version>
	</parent>

2、修改Handler

升级到2.3.0版本之后,我们发现Handler类报错了
在这里插入图片描述
原因就是因为,新版本的xxl-job,已经弃用了@JobHandler注解,采用了@XxlJob注解,并且@XxlJob注解只能作用在方法上面哦。

改造步骤:

  • 1、去掉@JobHandler注解
  • 2、去掉 extends IJobHandler
  • 3、方法上加上@XxlJob注解
  • 4、返回值 SUCCESS 改为 ReturnT.SUCCESS

代码参考:

java">package com.xxl.job.executor.service.jobhandler;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.log.XxlJobLogger;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;

@Component
public class DemoJobHandler {

	@XxlJob("demoJobHandler")
	public ReturnT<String> execute(String param) throws Exception {
		XxlJobLogger.log("XXL-JOB, Hello World.");

		for (int i = 0; i < 5; i++) {
			XxlJobLogger.log("beat at:" + i);
			TimeUnit.SECONDS.sleep(2);
		}
		return ReturnT.SUCCESS;
	}

}

3、启动服务并验证

版本也升级了,handler类也改造好了,貌似没什么问题了,那我们直接启动tomcat服务,来验证一下。
启动之后,我们看一下控制台日志

在这里插入图片描述

java">Connected to server
[2023-10-20 10:34:31,713] Artifact xxl-job-executor-sample-spring:war exploded: Artifact is being deployed, please wait...
20-Oct-2023 10:34:38.787 信息 [RMI TCP Connection(5)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
20-Oct-2023 10:34:38.885 严重 [RMI TCP Connection(5)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file
20-Oct-2023 10:34:38.887 严重 [RMI TCP Connection(5)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors
[2023-10-20 10:34:38,903] Artifact xxl-job-executor-sample-spring:war exploded: Error during artifact deployment. See server log for details.

如果这个看不出来,可以看一下另外的输出日志
在这里插入图片描述

java">org.apache.catalina.core.ApplicationContext.log No Spring WebApplicationInitializer types detected on classpath
20-Oct-2023 10:34:38.834 严重 [RMI TCP Connection(5)-127.0.0.1] org.apache.catalina.core.StandardContext.listenerStart Error configuring application listener of class org.springframework.web.util.Log4jConfigListener
 java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener

4、解决异常

刚刚启动服务的时候,报错了,比较核心的错误日志是这一句:

java">java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener

就是说tomcat启动的时候,没有找到spring中的Log4jConfigListener类,OK,我们先看一下spring的版本,升级到2.3.0之后,spring-webmvc的版本也跟着改变了,变成了5.3.3版本
在这里插入图片描述
经过查询,发现org.springframework.web.util.Log4jConfigListener这个类在spring5.0及以上版本已经废弃删除,如果想使用这个类,spring版本需要降低。原来如此,那我们直接将spring的版本降为升级前的版本

<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.3.22.RELEASE</version>
		</dependency>

OK,接下来启动服务,看一下
在这里插入图片描述

我们发现虽然报错了,但至少spring容器在加载初始化一些配置了,我们分析一下错误:

Invalid property 'appName' of bean class [com.xxl.job.core.executor.impl.XxlJobSpringExecutor]: Bean property 'appName' is not writable or has an invalid setter method. Did you mean 'appname'?

应该是属性名称不一样,我们找一下源码,打开一下XxlJobSpringExecutor类

java">public class XxlJobSpringExecutor extends XxlJobExecutor implements ApplicationContextAware, SmartInitializingSingleton, DisposableBean {
    private static final Logger logger = LoggerFactory.getLogger(XxlJobSpringExecutor.class);
    private static ApplicationContext applicationContext;

    public XxlJobSpringExecutor() {
    }

    public void afterSingletonsInstantiated() {
        this.initJobHandlerMethodRepository(applicationContext);
        GlueFactory.refreshInstance(1);

        try {
            super.start();
        } catch (Exception var2) {
            throw new RuntimeException(var2);
        }
    }
    .....

发现没有,继续找他的父类XxlJobExecutor,终于找到了,我们看到appname这个字段是这样命名的
在这里插入图片描述
所以,我们回到项目中,看一下项目中的配置文件
在这里插入图片描述
原来这个地方写成了appName,所以只要把他改成appname就可以了
在这里插入图片描述

5、再次启动服务并验证

在这里插入图片描述
我们发现终于启动成功了,再看一下,执行器是否注册到任务调度中心了
在这里插入图片描述
我们随便建一个任务执行一下看看
在这里插入图片描述
执行成功
在这里插入图片描述

在这里插入图片描述
至此,执行器版本升级结束


http://www.niftyadmin.cn/n/5108270.html

相关文章

【Python机器学习】sklearn.datasets样本生成操作

如何在没有真实数据的情况下,依然能够测试和优化机器学习模型? 在机器学习的实验或研究中,有时候手头并没有合适的数据集进行模型训练和测试。这时候合成或模拟数据集就显得尤为重要。sklearn.datasets模块就是这样一个强大的工具,它提供了一系列函数,不仅可以用于生成各…

行业追踪,2023-10-20

自动复盘 2023-10-20 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

牛客WY15 幸运的袋子 C++实现

幸运的袋子 袋子里的数字和大于数字积&#xff0c;才会是一个幸运的袋子。从这句话中&#xff0c;我们可以得到一个消息&#xff0c;也就是袋子里的数字必须要有1&#xff08;因为是袋子里全是正整数&#xff09;。 由这个条件&#xff0c;我们很容易想到先进行排序&#xff0…

协同过滤推荐算法UserCF、ItemCF

目录 相似度计算基于用户的协同过滤&#xff08;UserCF&#xff09;算法评估基于物品的协同过滤&#xff08;ItemCF&#xff09;协同过滤算法的权重改进协同过滤算法的问题分析思考学习参考 相似度计算 杰卡德&#xff08;Jaccard&#xff09;相似系数 Jaccard 系数是衡量两个…

Linux入门攻坚——4、shell编程初步、grep及正则表达式

bash的基础特性&#xff08;续&#xff09;&#xff1a; 1、提供了编程环境&#xff1a; 编程风格&#xff1a;过程式&#xff1a;以指令为中心&#xff0c;数据服务于执行&#xff1b;对象式&#xff1a;以数据为中心&#xff0c;指令服务于数据 shell编程&#xff0c;编译执…

Gradio的重要函数以及一些代码示例学习(一)

1 重要函数解析 1.1 Interface()类 参考&#xff1a; interface 最常用的基础模块构成。 应用界面&#xff1a;gr.Interface(简易场景), gr.Blocks(定制化场景)输入输出&#xff1a;gr.Image(图像), gr.Textbox(文本框), gr.DataFrame(数据框), gr.Dropdown(下拉选项), gr.…

前言:自动化框架的设计模式

1、UI自动化框架的设计模式 自动化测试框架有很多种&#xff0c;常见的自动化框架分类如下&#xff1a; 在使用上面的自动化框架时&#xff0c;通常会结合使用分层思想&#xff0c;也就是一些自动化框架设计模式&#xff0c;今天重点分享一下UI自动化框架设计使用比较多的一种…

分享一下微信公众号抽奖活动怎么弄

微信公众号抽奖活动是一种非常有效的营销手段&#xff0c;可以吸引大量用户参与&#xff0c;提高品牌曝光度和用户粘性。下面将介绍如何策划和实施一个成功的微信公众号抽奖活动。 一、明确活动目的 首先&#xff0c;需要明确微信公众号抽奖活动的目的。通常&#xff0c;抽奖活…