,xxl–job 是一个分布式任务调度平台,它的应用场景非常广泛,例如定时任务、消息推送、批处理等。xxl-job 中的任务类型主要有两种:,支持基于方法的开发方式,每个任务对应一个方法。,任务以源码方式维护在调度中心,支持通过Web IDE在线更新,实时编译和生效,因此不需要指定JobHandler。例如我的代码是python类型的代码,点击该任务右侧“GLUE”按钮,将会前往GLUE任务的Web IDE界面,在该界面支持对任务代码进行开发。,,GLUE Python任务代码编辑,
,但是大家注意到没有,这个地方没有涉及应用的环境问题,比如我的是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,在 xxl-job 的 GLUE 模式下,如果任务类型为 Java 类型,那么需要保证任务依赖的相关 JAR 包已经下载到本地环境中,否则任务执行会出现 ClassNotFoundException 等类加载异常。,一种比较简单的方式是将任务依赖的 JAR 包打成一个 Fat Jar,然后将 Fat Jar 放在执行器的 classpath 中即可。Fat Jar 是将多个 JAR 包合并成一个 JAR 包的方式,执行时只需要引入这个 JAR 包即可。例如我们修改执行器的pom.xml,加入fastjson(相当于把jar放到了执行器的classpath中),然后我们的DemoGlueJobHandler便可以引用fastjson里面的类了。,,demo glue直接引用相关类,,demo glue执行结果,除了把依赖包提前放到执行器的classpath之外(可能会有包的冲突),还可以在任务执行前,通过代码动态加载依赖的 JAR 包,避免手动打包依赖的麻烦。可以使用 URLClassLoader 类实现动态加载。首先我们把依赖的包放在一个共享盘上,保证执行器可以直接访问到,然后通过反射机制实现代码的调用与执行。具体实现方式可以参考以下代码示例:,,demo glue反射运行结果,在 xxl-job 的 GLUE 模式下,如果任务类型为 Python 类型,那么需要保证任务依赖的相关库已经下载到本地环境中,否则任务执行会出现 ImportError 等异常。,一种常用的方式是使用 Python 虚拟环境(Virtual Environment)来管理依赖库。虚拟环境是 Python 的一个功能,可以在一个独立的环境中安装 Python 和相关库,不会影响到全局环境。,
© 版权声明
文章版权归作者所有,未经允许请勿转载。