当前位置: 首页 > 后端技术 > Java

DataX--plug-inloader

时间:2023-04-01 21:40:49 Java

背景及解决方案我们假设一个情况,hbasereader是1.0版本,hbasewriter是2.0版本,所以他们依赖的jar包版本也不一致。如果直接加载到JVM虚拟机中,那么就会出现jar包冲突。为了避免冲突,需要为每个插件设置自己的类加载器(类加载的顺序参考前面的jvm-类加载),这样不同版本的jar包就不会冲突了。下面使用streamreader的job初始化来详细解释这个过程。JarLoaderJarLoader是各个插件的类加载器。为了避免重复生成,会以map的形式存放在内存jarLoaderCenter中。键为plugin.pluginType.pluginName,值为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配置文件中生成的路径信息。在创建JarLoader时,将路径路径的jar文件和子路径的jar文件添加到类路径中,这样各个插件需要的jar包在JarLoader加载时相互隔离,从而避免jar包冲突。比如streamreader在加载的时候,不仅会加载streamreader-0.0.1-SNAPSHOT.jar,还会加载libs下面的包。ClassLoaderSwapper因为我们需要在不同的地方使用不同的类加载器,所以在使用之前需要切换类加载器。比如当前的类加载器(用黄色表示)是A,我们现在使用的是类加载器B。我们先把当前的类加载器保存下来,放在紫色的(storeClassLoader)中暂存。然后把需要用到的类加载B变成黄色,表示当前使用的类加载是B,然后就可以使用B进行类加载了。使用后需要恢复临时的紫色类加载器。