XXL-JOB GLUE任务第三方依赖包的管理实践

XXL-JOB GLUE任务第三方依赖包的管理实践

背景

xxl-job 是一个分布式任务调度平台,它的应用场景非常广泛,例如定时任务、消息推送、批处理等。xxl-job 中的任务类型主要有两种:

  1. BEAN模式(方法形式)

支持基于方法的开发方式,每个任务对应一个方法。

优点:每个任务只需要开发一个方法,并添加”@XxlJob”注解即可,更加方便、快速。支持自动扫描任务并注入到执行器容器。
缺点:要求Spring容器环境;
基于方法开发的任务,底层会生成JobHandler代理,和基于类的方式一样,任务也会以JobHandler的形式存在于执行器任务容器中。

  1. GLUE模式(源码方式)

任务以源码方式维护在调度中心,支持通过Web IDE在线更新,实时编译和生效,因此不需要指定JobHandler。例如我的代码是python类型的代码,点击该任务右侧“GLUE”按钮,将会前往GLUE任务的Web IDE界面,在该界面支持对任务代码进行开发。

GLUE Python任务代码编辑

  1. 优点:这种方式相比 BEAN 模式更加灵活,因为任务逻辑不一定要用 Java 实现。
  2. 缺点:存在一定的安全风险,因为执行器可以执行任意的脚本文件

但是大家注意到没有,这个地方没有涉及应用的环境问题,比如我的是java代码,那我的程序中的某个包是否在本地能被引用到,即通过maven或是gradle已经下载本地了,或是我的python代码的依赖包是否在当前环境pip install了,我们从官方的github issues中,看到有很多同学提到了这些问题.但是这个官方没有给出具体的解决方案。这篇文档,就给大家谈谈这个问题。

https://github.com/xuxueli/xxl-job/issues/129

https://github.com/xuxueli/xxl-job/issues/254

https://github.com/xuxueli/xxl-job/issues/1401

GLUE模式(Java)任务依赖环境构建

在 xxl-job 的 GLUE 模式下,如果任务类型为 Java 类型,那么需要保证任务依赖的相关 JAR 包已经下载到本地环境中,否则任务执行会出现 ClassNotFoundException 等类加载异常。

一种比较简单的方式是将任务依赖的 JAR 包打成一个 Fat Jar,然后将 Fat Jar 放在执行器的 classpath 中即可。Fat Jar 是将多个 JAR 包合并成一个 JAR 包的方式,执行时只需要引入这个 JAR 包即可。例如我们修改执行器的pom.xml,加入fastjson(相当于把jar放到了执行器的classpath中),然后我们的DemoGlueJobHandler便可以引用fastjson里面的类了。

<!-- 阿里JSON解析器 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.68</version>
</dependency>

demo glue直接引用相关类
demo glue执行结果
除了把依赖包提前放到执行器的classpath之外(可能会有包的冲突),还可以在任务执行前,通过代码动态加载依赖的 JAR 包,避免手动打包依赖的麻烦。可以使用 URLClassLoader 类实现动态加载。首先我们把依赖的包放在一个共享盘上,保证执行器可以直接访问到,然后通过反射机制实现代码的调用与执行。具体实现方式可以参考以下代码示例:

package com.xxl.job.service.handler;

import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.IJobHandler;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

public class DemoGlueJobHandler extends IJobHandler {


    // 定义一个用于加载外部 JAR 包的 ClassLoader
    public class MyClassLoader extends URLClassLoader {
        public MyClassLoader(URL[] urls) {
            super(urls);
        }
    }

    // 加载外部 JAR 包的方法
    public void loadJars(String[] jarPaths) {
        URL[] urls = new URL[jarPaths.length];
        for (int i = 0; i < jarPaths.length; i++) {
            try {
                urls[i] = new URL("file:" + jarPaths[i]);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
        MyClassLoader myClassLoader = new MyClassLoader(urls);
        Thread.currentThread().setContextClassLoader(myClassLoader);
    }

    @Override
    public void execute() throws Exception {
        // 加载外部 JAR 包
        loadJars(new String[] {"/Users/dongluyang1/.m2/repository/com/alibaba/fastjson/1.2.28/fastjson-1.2.28.jar"});
        ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
        Class<?> jsonObjectClass = contextClassLoader.loadClass("com.alibaba.fastjson.JSONObject");
        Method put = jsonObjectClass.getMethod("put", String.class,Object.class);
        Object object =  jsonObjectClass.newInstance();
        put.invoke(object, "keyTest","valueTest");
        Method toJSONString = jsonObjectClass.getMethod("toJSONString");
        // 执行任务逻辑
        XxlJobHelper.log("XXL-JOB, Hello World."+toJSONString.invoke(object));
    }

}

demo glue反射运行结果

GLUE模式(Python)任务依赖环境构建

在 xxl-job 的 GLUE 模式下,如果任务类型为 Python 类型,那么需要保证任务依赖的相关库已经下载到本地环境中,否则任务执行会出现 ImportError 等异常。

一种常用的方式是使用 Python 虚拟环境(Virtual Environment)来管理依赖库。虚拟环境是 Python 的一个功能,可以在一个独立的环境中安装 Python 和相关库,不会影响到全局环境。

  1. 首先生成python代码文件,存储到公共目录,比如NFS某个目录下面
  2. 创建一个脚本文件,同时在任务的脚本中创建虚拟环境,安装所需的依赖库。可以使用以下命令:
# 创建虚拟环境
python3 -m venv /path/to/virtualenv
# 激活虚拟环境
source /path/to/virtualenv/bin/activate
# 安装依赖库
pip3 install package1 package2 ...

# 执行任务逻辑
...
# 退出虚拟环境
deactivate
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: XXL-JOB 是一个分布式任务调度平台,支持各种任务类型。以下是 XXL-JOB 支持的一些任务类型: 1. Shell 任务:通过执行 Shell 脚本来实现各种功能。 2. Java 任务:可以直接在 XXL-JOB 平台上运行 Java 代码,支持 Spring 等框架。 3. Python 任务:可以直接在 XXL-JOB 平台上运行 Python 代码,支持常见的 Python 库。 4. Command 任务:支持执行系统命令。 5. HTTP 任务:可以通过发送 HTTP 请求来实现各种功能。 6. Dubbo 任务:可以通过调用 Dubbo 服务来实现分布式任务调度。 7. SQL 任务:支持执行 SQL 语句。 8. Flink 任务:支持调度 Flink 作业。 9. Spark 任务:支持调度 Spark 作业。 10. Shell 并发分片任务:支持并发分片执行 Shell 命令。 11. GLUE 任务:支持调度 GLUE 作业。 12. JavaScript 任务:可以直接在 XXL-JOB 平台上运行 JavaScript 代码。 除了以上列举的任务类型,XXL-JOB 还支持自定义任务类型,可以根据需要实现自己的任务类型。 ### 回答2: XXL-JOB是一款开源的分布式任务调度平台,主要用于解决企业中的定时任务调度问题。它支持多种任务类型,括: 1. 脚本任务:可以执行Shell脚本、Python脚本、Node.js脚本等常见的脚本任务。 2. Java任务:可以执行Java程序或者Jar,支持各种Java框架,如SpringSpring Boot等。 3. PHP任务:支持执行PHP脚本,便于处理与后端业务相关的任务。 4. CMD任务:支持执行Windows或者Linux的CMD命令,方便执行一些系统命令或者批处理任务。 5. 广播任务:可以同时向多台服务器发送指令,对目标服务器进行操作。 6. 复制任务:可以将一台服务器上的数据复制到其他服务器上。 7. Http任务:支持发送HTTP请求,可以进行接口测试、数据采集等任务。 8. Python任务:支持执行Python脚本,可以灵活处理数据分析、机器学习等任务。 9. 程序任务:可以直接执行可执行程序,如C、C++等。 以上是XXL-JOB支持的一些常见任务类型,用户可以根据自己的需求选择适合的任务类型进行调度和执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值