2016-06-30 22 views
0

Ich brauche alle Schritte in Kettle .ktr Datei mit Java zu besuchen.Wasserkocher (Pentaho PDI): Wie alle Schritte eines Jobs zu besuchen

Ich

KettleEnvironment.init(); 
JobMeta jobMeta = new JobMeta("file.kjb", null); 
Job job = new Job(null, jobMeta); 

aber nicht Job noch JobMeta mit scheinen für den Besuch des Jobs auf die grundlegenden Schritte jede Methode zur Verfügung zu stellen.

+0

Eine wilde Vermutung von meiner Seite: Sie haben 'org.pentaho.di geprüft .job.DelegationListener' Schnittstelle? Scheint wie transformationDelegationStarted (Trans, TransExecutionConfiguration) -Methode aufgerufen wird, nachdem der Trans erstellt wurde, aber bevor es ausgeführt wird. Sie könnten versuchen, es zu implementieren und es Ihrem Job hinzuzufügen. – user4637357

+0

Danke. Versuchte 'job.addDelegationListener (new DelegationAdapter() public void transformationDelegationStarted (Transtrans, TransExecutionConfiguration transExecutionConfiguration) {// ...}' aber es wird nie aufgerufen. – Claudio

Antwort

0

Also habe ich es geschafft, es mit einer Kombination von DelegationListener und TransListener zu tun, jedoch bin ich nicht sicher, ob DelegationListener hier erforderlich ist. Vielleicht eine andere Art und Weise gibt es TransListeners Transformationsproz Job-Einträge hinzuzufügen:

package testTransformationsInJob; 

import java.util.List; 

import org.pentaho.di.core.KettleEnvironment; 
import org.pentaho.di.core.exception.KettleException; 
import org.pentaho.di.job.DelegationListener; 
import org.pentaho.di.job.Job; 
import org.pentaho.di.job.JobExecutionConfiguration; 
import org.pentaho.di.job.JobMeta; 
import org.pentaho.di.trans.Trans; 
import org.pentaho.di.trans.TransExecutionConfiguration; 
import org.pentaho.di.trans.TransListener; 
import org.pentaho.di.trans.step.StepMetaDataCombi; 
import org.pentaho.di.trans.step.StepInterface; 

public class MainClass { 

    public MainClass() { 
     // TODO Auto-generated constructor stub 
    } 

    private static class MyTransListener implements TransListener { 

     @Override 
     public void transActive(Trans arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void transFinished(Trans arg0) throws KettleException { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void transStarted(Trans delegatedTrans) throws KettleException { 
      List<StepMetaDataCombi> stepCombis = delegatedTrans.getSteps(); 
      if(stepCombis == null) { 
       return; 
      } 
      for(StepMetaDataCombi stepCombi: stepCombis) { 
       StepInterface step = stepCombi.step; 
       // 
       // Do some useful work here. 
       // 
       System.out.println("\t" + step.getStepname()); 
      } 
     } 

    } 

    private static class MyDelegationListener implements DelegationListener { 

     private TransListener transListener; 

     MyDelegationListener(TransListener transListener) { 
      this.transListener = transListener; 
     } 

     @Override 
     public void jobDelegationStarted(Job delegatedJob, 
       JobExecutionConfiguration jobExecutionConfiguration) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void transformationDelegationStarted(Trans delegatedTrans, 
       TransExecutionConfiguration transExecutionConfiguratioStep) { 
      System.out.println("transformationDelegationStarted"); 
      System.out.println(delegatedTrans.getName()); 
      // transformationDelegationStarted() is called after Trans object is constructed 
      // but before it is executed. 
      // However, we can't access steps at this point using delegatedTrans.getSteps() 
      // since steps are constructed somewhere in execute method. 
      // However, we can add TransListener here, which will be able to iterate steps. 
      delegatedTrans.addTransListener(this.transListener); 
     } 

    } 

    public static void main(String[] args) throws KettleException { 
     KettleEnvironment.init(); 
     JobMeta jobMeta = new JobMeta("d:\\test_job.kjb", null); 
     Job job = new Job(null, jobMeta); 
     // Here I add a DelegationListener, which will add a TransListener to every Trans in job. 
     // Not sure though if using DelegationListener is a right way to access Transformation Job Entries 
     // Maybe there is a more elegant way to do it. 
     MyTransListener myTransListener = new MyTransListener(); 
     DelegationListener delegationListener = new MyDelegationListener(myTransListener); 
     job.addDelegationListener(delegationListener); 
     job.start(); 
     job.waitUntilFinished(); 
    } 

} 

Und hier ist die Ausgabe erhalte ich:

2016/07/07 09:47:37 - test_job - Start of job execution 
2016/07/07 09:47:37 - test_job - Starting entry [Transformation] 
2016/07/07 09:47:37 - Transformation - Loading transformation from XML file [file:///d://test.ktr] 
transformationDelegationStarted 
test 
2016/07/07 09:47:37 - test - Dispatching started for transformation [test] 
    Detect empty stream 
    User Defined Java Class 
2016/07/07 09:47:37 - Detect empty stream.0 - Finished processing (I=0, O=0, R=0, W=1, U=0, E=0) 
2016/07/07 09:47:38 - User Defined Java Class.0 - Finished processing (I=0, O=0, R=1, W=1, U=0, E=0) 
2016/07/07 09:47:38 - test_job - Finished job entry [Transformation] (result=[true]) 
2016/07/07 09:47:38 - test_job - Job execution finished