Kettle4.3源码分析
1:在使用kettle的表输入插件,抽取Mysql数据的时候 会报如下的一个错误
You have a n error in your SQL syntax; check the manual that corresponds to your MySQL serv er version for the right syntax to use near 'OPTION SQL_SELECT_LIMIT=DEFAULT' at
这个错误的原因是mysql的驱动版本太低。。我原来用的 mysql-connector-java-5.1.7-bin.jar。后来改为
mysql-connector-java-5.1.30-bin就正常了。
2:kettle的JobEntryLoader--Job启动初始化类
调用顺序:Spoon-->main-->initPlugins()-->JobEntryLoader.init()。
在这里Kettle会把所有的Job插件读取放到
private List<JobPlugin> pluginList 的一个成员变量里面。
每个节点下都有很多插件,大概一共有60多个,所以初始化完后pluginList的size应该也是60多
下面看一下JobPlugin的内部结构
根据以上的堆栈信息,当我们需要查找一个Job插件的时候,JobEntryLoader 提供的一些方法就非常好理解了。
而且注意的是JobPlugin的type 值都是 1。findJobPluginWithId 和 findJobEntriesWithId 的内部源码是一样的。
3:如何创建一个作业JobMeta
一个作业叫做一个JobMeta,特别注意的是作业不是作业步骤,作业是文件菜单下新建作业的那个作业,是所有作业步骤的容器。
源码位置:Spoon--newJobFile()
调用顺序:Spoon-main-init-addMenu-addMenuListeners--ProupMenu的菜单点击事件
核心代码:
JobMeta jobMeta = new JobMeta(log);
jobMeta.addObserver(this);
jobMeta.setName(STRING_JOB + " " + nr);
如果直接将作业保存为一个文件,可以将setName改为调用setFilename(String filename);
4:如何创建一个转换TransMeta
源码位置:Spoon--newTransFile()
核心代码:
TransMeta transMeta = new TransMeta();
transMeta.addObserver(this);
transMeta.setName(STRING_TRANSFORMATION + " " + nr);
总体模式和创建JobMeta类似,代码调用顺序也可以参考JobMeta
5:资源库Repository相关源码
RepositoriesMeta input = new RepositoriesMeta(log);//注意是带s的
input.readData();//读取连接信息
那么问题是kettle去哪里读取资源库连接信息呢
看readData里面的代码里就可以知道答案
首先他会查找bin/embedded/.creator/repositories.xml文件,
如果没有就会去查找NVL(System.getProperty("CREATOR_HOME"), System.getProperty("user.home"))++ FILE_SEPARATOR + BasePropertyHandler.getProperty("userBaseDir", ".kettle"); 路径下的repositories.xml
在windows下就是我的文档目录下。
找到配置文件后就开始读取里面的配置了--readData里面的关键代码:
其中repinfo.loadXml(repnode,databases) 是在databases中查找默认资源库对应的连接,将相应的DatabaseMeta赋给repinfo。
实例化一个资源库:构造方法public Repository(LogWriter log, RepositoryMeta repinfo, UserInfo userinfo)
repinfo可以从RepositoriesMeta里获取,userinfo就是登陆的用户信息,主要是用户名和密码。
然后调用Repository的connect方法可以测试是否可以连接到资源库。
6:创建一个Job步骤,JobEntryCopy
源码位置:SpoonJobDelegate--newJobEntry
需要说明的代码:
isSpecial()-->开始和空操作两个步骤是special
如果是开始步骤,则判断面板中是否已经有改步骤,如果有,则给出错误提示。
如果是空操作,则把空标志设置为true。