Ejecutar Transformaciones y Trabajos de Kettle desde Java

Kettle ( a.k.a. Pentaho Data Integration) es una de las herramientas más versátiles que conozco. Ha pasado de ser una herramienta ETL a ser prácticamente un Lenguage de Programación Visual . Eso lo saben bien los amigos de Hitachi, Pentaho y Webdetails....

Recientemente me he visto en la necesidad de incorporar transformaciones y trabajos dentro de aplicaciones java..... Nada más sencillo:

Creamos nuestro proyecto Java...



Importamos todas las librerías que podamos necesitar al build path:
  • {MI_KETTLE_DIR}/lib/
  • {MI_KETTLE_DIR}/libext/
  • {MI_KETTLE_DIR}/libext/commons/
  • {MI_KETTLE_DIR}/libext/pentaho/
  • {MI_KETTLE_DIR}/libext/spring/
En el caso de que queramos invocar una transformación deberemos hacerlo tal y cómo se muestra en la clase de ejemplo que se muestra a continuación:

RunTran.java

package runTrans;

import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;

public class RunTrans {
    public static void main(String[] args) {
        String filename = args[0];
        try {
            KettleEnvironment.init();
            TransMeta metaData = new TransMeta(filename);
            Trans trans = new Trans(metaData);
            trans.execute(null);
            trans.waitUntilFinished();
            if (trans.getErrors() > 0) {
                System.out.print("Error Ejecutando la transformacion");
            }
        } catch (KettleException e) {
            e.printStackTrace();
        }
    }
}


Ahora tan sólo tenemos que invocar nuestra clase pesándole cómo argumento el path completo de nuestra transformación.



En el caso de que queramos invocar un trabajo deberemos hacerlo tal y cómo se muestra en la clase de ejemplo que se muestra a continuación:

RunJob.java


package runJob;

import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobMeta;

public class RunJob {
       public static void main(String[] args) throws Exception {
      String filename = args[0];
      KettleEnvironment.init();
      JobMeta jobMeta = new JobMeta(filename, null);
      Job job = new Job(null, jobMeta);
      job.start();
      job.waitUntilFinished();
      if (job.getErrors()!=0) {
        System.out.println("Error ejecutando el trabajo");
     } }
}


Ahora tan sólo tenemos que invocar nuestra clase pesándole cómo argumento el path completo de nuestro trabajo.


Fuentes:

Este código ha sido probado con la versión 4.4 de Kettle... aunque estoy bastante seguro que con kettle 5 también funcionará.