kettle插件加载流程

kettle插件加载流程

1.前言

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

2.PluginRegistry了解

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

  • Map<Class<? extends PluginTypeInterface>, List<String>> categoryMap:插件类型->该类型插件的类目,category对应spoon工具左侧的插件种类,如:‘输入’,‘输出’等
  • List<PluginTypeInterface> pluginTypes:保存了kettle的插件类型,在环境初始化的时候会把所有类型添加到该list里面。
  • Map<Class<? extends PluginTypeInterface>, List<PluginInterface>> pluginMap:插件类型->该类型的具体插件,例如:StepPluginType->[表输入,表输出......] 

3.插件加载--PluginRegistry.init()

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

    DKETTLE_PLUGIN_CLASSES=org.pentaho.di.trans.steps.gpload.GPLoadMeta,org.pentaho.di.core.database.PALODatabaseMeta  //以逗号隔开

3.流程图

时间: 2024-10-10 14:44:56

kettle插件加载流程的相关文章

基于.NET MVC的高性能IOC插件化架构(二)之插件加载原理

上一篇博文简单介绍了下插件化的代码组成部门:http://www.cnblogs.com/gengzhe/p/4390932.html 这篇博客主要讲解下插件化实现的原理,先面先讲解几个概念: 一.契约 插件与系统必须有契约,系统才能发现插件并正确加载插件,我采用的是所有插件都实现Sun.Core里面的IPlugin接口. 二.自述 插件在被加载的时候,需要告诉系统,我是什么类型的插件,我的guid,我依赖的程序集,我的状态与权限,我的配置信息等等,这个行为是插件的自我描述,简称自述. 三.配置

android 插件加载机制之二

------本文转载自 Android插件化原理解析--插件加载机制 这一系列的文章实在是写的好! 5 Hook ClassLoader 从上述分析中我们得知,在获取LoadedApk的过程中使用了一份缓存数据: 这个缓存数据是一个Map,从包名到LoadedApk的一个映射.正常情况下,我们的插件肯定不会存在于这个对象里面: 但是如果我们手动把我们插件的信息添加到里面呢?系统在查找缓存的过程中,会直接命中缓存! 进而使用我们添加进去的LoadedApk的ClassLoader来加载这个特定的A

Android5.1图库Gallery2代码分析数据加载流程

图片数据加载流程. Gallery---->GalleryActivity------>AlbumSetPage------->AlbumPage--------->PhotoPage 相册集                        照片集                 某张图片 1,AlbumSetPage.java private void initializeData(Bundle data) { String mediaPath = data.getString(A

WebKit加载流程 - 概述

之前写了几篇加载流程的说明,是从下向上看,有点只见树木不见森林的感觉.经过最近一段时间的学习,有了能加以概括抽象的方法. WebKit加载流程和页面组成是直接相关的,页面就是WebKit要加载的对象.所以WebKit负责加载的类也与负责页面管理的类相对应.Apple关于WebView的说明里清楚表现了页面视图上的MVC结构: 一个页面从元素上也有其层次结构,并且和加载类对应,如下: 从页面元素上讲WebView代表了一个页面的呈现,对应一个Page. 一个Page包含一个或多个Frame,其中一

Android知识体系梳理笔记三:动态代理模式---插件加载机制学习笔记

静态代理模式 静态代理模式就是我们常说的代理设计模式,我们采用一个代理类调用原有的方法,且对产生的结果进行控制:举个例子:我们现在在玩一款网络游戏,需要打怪升级:太累就找个代理吧,一觉醒来就会发现我们已经当上CEO,迎娶白富美,天下第一了! 本来我们只能打怪,打怪-,但经过代理类增强,我们不仅可以打怪,还可以升级拿装备.就这样子了! 上代码: * 同一功能接口 public interface PlayNetGame { String beatMonster(); } 1 2 3 4 1 2 3

android源码解析(十七)--&gt;Activity布局加载流程

好吧,终于要开始讲讲Activity的布局加载流程了,大家都知道在Android体系中Activity扮演了一个界面展示的角色,这也是它与android中另外一个很重要的组件Service最大的不同,但是这个展示的界面的功能是Activity直接控制的么?界面的布局文件是如何加载到内存并被Activity管理的?android中的View是一个怎样的概念?加载到内存中的布局文件是如何绘制出来的? 要想回答这些问题,我们就需要对android的界面加载与绘制流程有所了解,这里我们先来学习一下Act

spring IOC加载流程

看了网上.书上很多对于spring IOC容器加载过程的分析.大多都只是粗略的讲一下加载流程.其实这样也不错,简单粗暴.清晰记得之前和一个前辈交流时他说的一句话:什么设计模式.设计框架都是扯淡,能实现这个功能就是最好的.其实这样的说法是话走偏锋的,为什么要有各种框架.设计模式,主要还是因为没有它们不能够很好的实现功能.就比如说IOC容器加载中常用的FileSystemXmlApplicationContext,这个类到最顶层的BeanFactory接口,之间有8层集成实现关系.为什么只需要一个类

Qt中如何 编写插件 加载插件 卸载插件

Qt中如何 编写插件 加载插件 卸载插件是本文要介绍的内容.Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoader来加载和卸载这些库.由于在开发项目的过程中,要开发一套插件系统,就使用了Qt的这套类库. 一 编写插件 编写一个Qt的插件需要以下步骤 1.声明一个插件类, 2.定义一个类,实现这个插件类定义的接口,定义的这个类必须从QObject集成下来. 3.使用Q_INTERFACESQ_INTERFACE

Qt5的插件机制(1)--Qt 框架中的插件加载机制概述

概述 Qt的源码中通过 Q<pluginType>Factory.Q<pluginType>Plugin 和 Q<pluginType> 这三个类实现了Qt的插件加载机制, 这个机制可用于加载特定种类的插件.比如通过 QPlatformIntegrationFactory\QPlatformIntegrationPlugin\QPlatformIntegration 三个类可以实现平台类QPA插件(PlatformIntegration)的加载,通过QPlatformI