kettle工具是一款优秀的数据同步、数据处理的BI工具,收到了很多人的青睐。kettle软件通过可视化的图标可以让我们很轻易的能完成数据同步、处理的开发工作。但是使用kettle可视化界面在跑JOB久之后,会报JAVA SWT的错误,故为了程序的稳定性,我们需要对其进行二次开发。
1.kettle可视化界面设计
由于业务不同,使用kettle工具做出的设计也不同,故在此只写一下如何设置连接参数为全局变量参数。
a)设置全局变量,如下图操作
编辑>设置环境变量
b)在弹出的环境变量框中,输入变量名称及变量值
c)创建一个新的连接,将连接参数设置为变量即可,如下图
注:若transform报“Streaming result set com.mysql.jdbc.RowDataDynamic@a42491 is still active.”错误,则将数据库连接里面的前面的对勾去了即可
2.kettle二次开发
由于kettle可视化界面不稳定,所以我们决定使用代码来启动JOB。
a)将使用kettle工具时生成的.kettle文件放在工程的WEB-INF下面,如下图
b)修改repositories.xml下面我们的kettle的xml文件存放的地址
c)在servlet中将当前工程执行路径传入同步类中,使其可以用该路径初始化kettle环境,代码如下:
/** * 设置Kettle的初始化配置信息路径 * @throws KettleException */ private void initKettleEnvironment() { // 获得执行类的当前路径 String kettleHome = this.getServletContext().getRealPath(File.separator + "WEB-INF"); System.out.println("kettleHome--->"+kettleHome); this.mKettelHome = kettleHome; }
private void startKettleTask()throws Exception{ Timer kettleTask= new Timer(); kettleTask.schedule(new KettleTask(this.mKettelHome), 0, "2000"); }
d)kettleTask类中开启kettleJOB,代码如下:
public class KettleTask extends TimerTask { private String mKettleHome; public KettleTask() { super(); } public KettleTask(String kettleHome) throws KettleException { super(); this.mKettleHome = kettleHome; } @Override public synchronized void run() { Repository repository = null; Job job = null; try { // Kettle初始化需要修改相应的配置路径 String user_dir = System.getProperty("user.dir"); System.setProperty("user.dir", mKettleHome); System.setProperty("KETTLE_HOME", mKettleHome); //设置连接环境变量 System.setProperty("DATABASE_IP_ADDRESS", "127.0.0.1"); System.setProperty("DATABASE_DATABASE", "mysql"); System.setProperty("DATABASE_IP_PORT","3306"); System.setProperty("DATABASE_USERNAME", "root"); System.setProperty("DATABASE_PASSWORD", "root"); // 运行环境初始化(设置主目录、注册必须的插件等) KettleEnvironment.init(); // Kettle初始化完毕,还原执行类的当前路径 System.setProperty("user.dir", user_dir); RepositoriesMeta repositoriesMeta = new RepositoriesMeta(); // 从文件读取登陆过的资源库信息 repositoriesMeta.readData(); // 选择登陆过的资源库 RepositoryMeta repositoryMeta = repositoriesMeta .findRepository("kettleDemo"); // 获得资源库实例 repository = PluginRegistry.getInstance().loadClass( RepositoryPluginType.class, repositoryMeta.getId(), Repository.class); repository.init(repositoryMeta); // 连接资源库 repository.connect("demo", "demo"); System.out.println("Repository SyncData connect success."); JobMeta jobMeta = null; jobMeta = new JobMeta( WsUtility .getPropertyString("RootDirectory", "file:////D://kettleDemo//") + "kettleDataJob.kjb", repository); // 执行指定转换 if (jobMeta != null) { job = new Job(repository, jobMeta); job.start(); job.waitUntilFinished(); if (job.getErrors() > 0) { System.out.println("decompress fail!"); } } repository.disconnect(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }
至此我们就完成了代码启动kettle的JOB了。