2023年JAVA集成调用Kettle示例

最近要弄一个java调用kettle的代码,查找网上的例子有很多的jar包下不下来,弄下来了各种报错,花了一点时间趟平了坑。临近新年,最后祝各位新年快乐!

成功示例

确认版本

依赖的jar包以pom的形式引入,有诸多版本,如果与kettle的版本不匹配则会调用失败。因为在java代码里会初始化插件来执行任务,查看插件版本9.0.0.0-423.

引入依赖

仓库镜像地址:
<repository>
    <id>pentaho-public</id>
    <name>Pentaho Public</name>
    <url>https://repo.orl.eng.hitachivantara.com/artifactory/pnt-mvn/</url>
    <releases>
        <enabled>true</enabled>
        <updatePolicy>daily</updatePolicy>
    </releases>
    <snapshots>
        <enabled>true</enabled>
        <updatePolicy>interval:15</updatePolicy>
    </snapshots>
</repository>
<dependency>
    <groupId>pentaho-kettle</groupId>
    <artifactId>kettle-core</artifactId>
    <version>9.0.0.0-423</version>
</dependency>
<dependency>
    <groupId>pentaho-kettle</groupId>
    <artifactId>kettle-dbdialog</artifactId>
    <version>9.0.0.0-423</version>
</dependency>

<dependency>
    <groupId>pentaho-kettle</groupId>
    <artifactId>kettle-engine</artifactId>
    <version>9.0.0.0-423</version>
</dependency>

<dependency>
    <groupId>pentaho</groupId>
    <artifactId>metastore</artifactId>
    <version>9.0.0.0-423</version>
</dependency>

以前的pentao镜像地址已经打不开了,https://nexus.pentaho.org/content/groups/omni/ ,估计以后也不会恢复了,所以使用新地址https://repo.orl.eng.hitachivantara.com/artifactory/pnt-mvn/

java源代码

可以执行转换和任务,特别注意到pluginsPath需要修改到pentao的插件目录 x:\xx\data-integration\plugins

import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.plugins.PluginFolder;
import org.pentaho.di.core.plugins.PluginFolderInterface;
import org.pentaho.di.core.plugins.StepPluginType;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.repository.ObjectId;
import org.pentaho.di.repository.RepositoryDirectoryInterface;
import org.pentaho.di.repository.kdr.KettleDatabaseRepository;
import org.pentaho.di.repository.kdr.KettleDatabaseRepositoryMeta;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;

import java.io.File;
import java.util.List;

/**
 * kettle服务
 * @author 
 */
public class KettleTool {



    private static String username = "xxx";
    private static String password = "xxx";
    private static String pluginsPath = "D:\\workspace\\data-integration\\data-integration\\plugins";

    /**
     * 加载kettle插件
     */
    static {
        File dir = new File(pluginsPath);
        File[] files = dir.listFiles();
        List<PluginFolderInterface> pluginFolders = StepPluginType.getInstance().getPluginFolders();
        for (File file: files ) {
            pluginFolders.add(new PluginFolder(pluginsPath + "\\" + file.getName() , false , true));
        }
    }

    /**
     * 数据库连接元对象
     * (kettle数据库连接名称(KETTLE工具右上角显示),资源库类型,连接方式,IP,数据库名,端口,用户名,密码) //cgmRepositoryConn
     */
    private static DatabaseMeta getDatabaseMeta(){
        DatabaseMeta databaseMeta = new DatabaseMeta("123", "MYSQL", "Native(JDBC)", "127.0.0.1",
                "kettle_repo", "3306", "root", "123456");
        // 关闭mysql推荐SSL连接提示
        databaseMeta.addExtraOption("MYSQL" , "useSSL" , "false");
        return databaseMeta;
    }

    public static void main(String[] args) throws Exception {
        executeTrans("/ETL_TEST" , "ETL_TABLE_SINGLE_TEST");
    }

    /**
     * 执行转换
     * @param folder
     * @param transId
     * @throws KettleException
     */
    public static void executeTrans(String folder, String transId) throws KettleException{
        KettleDatabaseRepository repository = RepositoryCon();
        // 获取目录
        RepositoryDirectoryInterface directory = repository.loadRepositoryDirectoryTree().findDirectory(folder);
        // 根据作业名称获取作业id,加载作业
        ObjectId id = repository.getTransformationID(transId , directory);
        TransMeta transMeta = repository.loadTransformation(id, null);
        Trans trans = new Trans(transMeta);
        String[] arguments = new String[2];
        trans.execute(arguments);
        trans.waitUntilFinished();
    }

    /**
     * 执行任务
     *
     * @param folder
     * @param jobId
     * @throws KettleException
     */
    public static void executeTask(String folder, String jobId) throws KettleException {
        KettleDatabaseRepository repository = RepositoryCon();
        // 获取目录
        RepositoryDirectoryInterface directory = repository.loadRepositoryDirectoryTree().findDirectory(folder);
        // 根据作业名称获取作业id
        ObjectId id = repository.getJobId(jobId, directory);
        // 加载作业
        JobMeta jobMeta = repository.loadJob(id, null);
        Job job = new Job(repository, jobMeta);
        // 执行作业
        job.run();
        // 等待作业执行完毕
        job.waitUntilFinished();
    }

    /**
     * * 连接到资源库
     */
    private static KettleDatabaseRepository RepositoryCon() throws KettleException {

        // 初始化环境
        if (!KettleEnvironment.isInitialized()) {
            try {
                KettleEnvironment.init();
            } catch (KettleException e) {
                e.printStackTrace();
            }
        }
        // 数据库形式的资源库元对象
        KettleDatabaseRepositoryMeta kettleDatabaseRepositoryMeta = new KettleDatabaseRepositoryMeta();
        kettleDatabaseRepositoryMeta.setConnection(getDatabaseMeta());
        // 数据库形式的资源库对象
        KettleDatabaseRepository kettleDatabaseRepository = new KettleDatabaseRepository();
        // 用资源库元对象初始化资源库对象
        kettleDatabaseRepository.init(kettleDatabaseRepositoryMeta);
        // 连接到资源库 , 默认的连接资源库的用户名和密码
        kettleDatabaseRepository.connect(username, password);
        if (kettleDatabaseRepository.isConnected()) {
            System.out.println("连接成功");
            return kettleDatabaseRepository;
        } else {
            System.out.println("连接失败");
            return null;
        }
    }


}

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要实现Java远程调用Kettle,可以按照以下步骤进行操作: 1. 首先,确保已经将Kettle所需的jar文件添加到项目的构建路径中。 2. 创建一个Java程序,并导入Kettle相关的类库。可以使用Kettle提供的`Kitchen`类来执行Kettle作业或转换。 3. 在Java程序中,通过创建一个`KettleEnvironment`对象来初始化Kettle环境。这将加载所需的配置文件和类库。 4. 创建一个`TransMeta`对象或`JobMeta`对象来加载Kettle转换或作业的定义。可以使用`TransMeta`类来加载和执行Kettle转换,使用`JobMeta`类来加载和执行Kettle作业。 5. 使用`KettleEnvironment.init()`方法来初始化Kettle环境。 6. 创建一个`Trans`对象或`Job`对象,使用前面创建的`TransMeta`对象或`JobMeta`对象作为参数。 7. 调用`Trans`对象或`Job`对象的`execute()`方法来执行Kettle转换或作业。 8. 检查执行结果,可以通过检查日志或获取作业的状态来确定执行是否成功。 下面是一个示例代码,展示了如何通过Java远程调用Kettle转换: ```java import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransMeta; public class KettleRemoteCallExample { public static void main(String[] args) { try { // 初始化Kettle环境 KettleEnvironment.init(); // 加载Kettle转换定义 String transPath = "path/to/your/transform.ktr"; TransMeta transMeta = new TransMeta(transPath); // 创建Kettle转换 Trans trans = new Trans(transMeta); // 执行Kettle转换 trans.execute(null); trans.waitUntilFinished(); // 检查执行结果 if (trans.getErrors() == 0) { System.out.println("Kettle转换执行成功!"); } else { System.out.println("Kettle转换执行失败!"); } } catch (Exception e) { e.printStackTrace(); } } } ``` 请注意,上述示例代码中的`path/to/your/transform.ktr`应替换为实际的Kettle转换文件路径。根据需要,您可以更改代码以适应作业的调用。 通过以上步骤,您可以在Java程序中远程调用Kettle转换或作业。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值