关于java:DataX-插件加载器

4次阅读

共计 1058 个字符,预计需要花费 3 分钟才能阅读完成。

背景及解决方案

咱们假如一个状况,hbase 的 reader 是 1.0 版本的,hbase 的 writer 是 2.0 版本的,所以他们依赖的 jar 包版本也不统一,如果间接一起加载到 JVM 虚拟机,那就会有 jar 包的抵触。

为了防止抵触,就须要给每个插件都设置一个本人的类加载器(类加载的程序参考之前的 jvm – 类的加载),这样不同版本的 jar 包就不会抵触。

上面用 streamreader 的 job 初始化具体的解说这个流程。

JarLoader

JarLoader 是每个插件的类加载器,为了防止反复的生成,会通过 map 的模式寄存在内存 jarLoaderCenter 中,key 就是 plugin.pluginType.pluginName,value 就是 JarLoader。

pluginType 是一个枚举,包含 reader、writer、transformer、handler,pluginName 就是插件的名称。比方 streamreader 的 key 就是 plugin.reader.streamreader。

每次获取类加载器的时候,就会从 jarLoaderCenter 中获取,如果有对应的 key-value,就返回 JarLoader,如果没有,就创立一个 JarLoader,并存入 jarLoaderCenter 再返回 JarLoader。

JarLoader 创立

如果 jarLoaderCenter 没有对应的 JarLoader,就会创立一个 JarLoader。

首先是获取门路 path,就是读取 reader.streamreader 的 plugin.json 配置文件中生成的 path 信息。

在创立 JarLoader 的时候,就会把 path 门路的 jar 文件以及子门路的 jar 文件都退出退出到 class path 中,所以每个插件所须要的 jar 包在通过 JarLoader 加载的时候是互相隔离的,这样就防止的 jar 包抵触。

比方加载的时候,streamreader 除了把 streamreader-0.0.1-SNAPSHOT.jar 加载进来,也会加载 libs 以下的包。

ClassLoaderSwapper

因为咱们须要在不同的中央应用不同的类加载器,所以在应用之前就须要对类加载器进行切换。

比方以后(用黄色代表)的类加载器是 A,咱们当初应用类加载 B。

咱们首先把以后的类加载器存起来,放入紫色(storeClassLoader)中暂存。而后再把须要应用的类加载 B 放入黄色中,代表以后应用的类加载是 B。

而后就能够应用 B 进行类加载,当应用完后,就须要把暂存在紫色的类加载器进行还原。

正文完
 0