kettle插件加载流程

  • Post author:
  • Post category:其他

前言

kettle遵循着插件机制,基于插件使得kettle整个结构非常清晰,耦合性低,移植性强,特别是对kettle进行二次开发尤其方便,根据了解,扩展step类型的插件比较多,具体步骤可以参考:http://blog.csdn.net/d6619309/article/details/50020977 。通过了解插件的加载流程,不仅kettle的原理有深一层的认识,还有助于在进行二次开发遇到问题的时候进行定位(例如,最近遇到个情况就是通过kettle api创建资源库,但在使用spoon工具保存转换到该资源库时出错,其实就是因为资源库中step类型与实际中step插件不一致导成的,造成不一致的原因是因为通过api创建资源库时kettle环境中加载不到某些插件信息),本文是基于kettle5.x,插件类型很多,选取StepPluginType类型为例进行描述。

PluginRegistry了解

PluginRegistry是一个提供所有访问所有kettle插件的单例。可以通过它注册插件类型以及插件,还可以查询每种类别的插件,挑几个以下会用到的属性进行说明

  • Map< Class< ? extends PluginTypeInterface>, List> categoryMap:插件类型->该类型插件的类目,category对应spoon工具左侧的插件种类,如:‘输入’,’输出’等

  • List< PluginTypeInterface> pluginTypes:保存了kettle的插件类型,在环境初始化的时候会把所有类型添加到该list里面。

  • Map< Class< ? extends PluginTypeInterface>, List> pluginMap:插件类型->该类型的具体插件,例如:StepPluginType->[表输入,表输出…]

插件加载–PluginRegistry.init()

  1. 注册PluginRegistryPluginType插件类型,并获得该类型的插件并加载初始化,最后保存到List extensions,可以不关注该步骤
  2. 调用registerPluginType(StepPluginType)方法进行注册:
  3. 把StepPluginType添加到pluginMap中,如果StepPluginType未注册,则初始化一个空的List用来保存该插件类型的具体插件
  4. 把StepPluginType添加到categoryMap中,如果StepPluginType未注册,则初始化一个空的List来保存该插件类型的类目
  5. 把插件类型注册之后,根据该类型查找所有该类型的具体插件,它会通过3种方式来加载:
  6. registerNatives():查找原生的step插件。首先加载kettle-steps.xml(该配置文件在kettle-engine模块中)获取里面所有step配置,可以在环境变量中设置“KETTLE_CORE_STEPS_FILE”来覆盖默认的kettle-steps.xml;然后调用registerPluginFromXmlResource(),解析出step所有的属性,根据属性构造出来个Plugin对象;接着,把该插件信息保存到pluginMapcategoryMap对应插件类型的value(List)中;最后 ,触发该插件类型的添加、改变插件的事件 。
  7. registerPluginJars():根据jar包注册插件(通过注解方释来描述插件)。首先,Windows下先会默认从[plugins, plugins\steps, C:\Users\Administrator\.kettle\plugins, C:\Users\Administrator\.kettle\plugins\steps]这几个目录中查找StepPluginType类型的插件jar包;然后,调用handlePluginAnnotation():通过注解解析出所有插件相关的描述属性,并构造Plugin对象;接着,把该插件信息保存到pluginMapcategoryMap对应插件类型的value(List)中;最后 ,触发该插件类型的添加、改变插件的事件 。
  8. registerXmlPlugins():根据xml配置文件注册插件。首先,Windows下先会默认从[plugins, plugins\steps, C:\Users\Administrator\.kettle\plugins, C:\Users\Administrator\.kettle\plugins\steps]这几个目录中查找StepPluginType类型插件的配置文件:xxxplugin.xml;然后,解析节点内容,并调用registerPluginFromXmlResource(),解析出step所有的属性,根据属性构造出来个Plugin对象;接着,把该插件信息保存到pluginMapcategoryMap对应插件类型的value(List)中;最后 ,触发该插件类型的添加、改变插件的事件 。
  9. 还可以从环境变量中读取“KETTLE_PLUGIN_CLASSES”的值,从中加载指定的插件,该方法对调试模式非常有利,可以通过在eclipse中启动spoon时添加VM arguments:
DKETTLE_PLUGIN_CLASSES=org.pentaho.di.trans.steps.gpload.GPLoadMeta,org.pentaho.di.core.database.PALODatabaseMeta  //以逗号隔开

流程图

在这里插入图片描述


版权声明:本文为czmacd原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。