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。