如何使用JavaAPI从Pentaho作业中获取错误?

如何使用JavaAPI从Pentaho作业中获取错误?,java,pentaho,kettle,Java,Pentaho,Kettle,我正在使用以下代码执行一些Pentaho作业(不是我的,只是来自一个旧应用程序。如果需要,我必须更改代码): 一切似乎都很好,但是if语句返回true,我得到了一个糟糕的非感官信息,如下所示: 2015-03-29 16:30:43,658 INFO [com.foo.bar.component.ETLComponent] ERROR on job /home/path/to/pentaho/jobs/main_job.kjb java.lang.RuntimeException:

我正在使用以下代码执行一些Pentaho作业(不是我的,只是来自一个旧应用程序。如果需要,我必须更改代码):

一切似乎都很好,但是
if
语句返回
true
,我得到了一个糟糕的非感官信息,如下所示:

2015-03-29 16:30:43,658 INFO  [com.foo.bar.component.ETLComponent] ERROR on job /home/path/to/pentaho/jobs/main_job.kjb
java.lang.RuntimeException:
        at com.foo.barpentaho.KettleService.executeJob(KettleService.java:48)  //my class
        at com.foo.bar.component.ETLComponent.process(ETLComponent.java:64)    //my class
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.mule.model.resolvers.AbstractEntryPointResolver.invokeMethod(AbstractEntryPointResolver.java:151)
        at org.mule.model.resolvers.ExplicitMethodEntryPointResolver.invoke(ExplicitMethodEntryPointResolver.java:93)
        at org.mule.model.resolvers.DefaultEntryPointResolverSet.invoke(DefaultEntryPointResolverSet.java:39)
        at org.mule.component.DefaultComponentLifecycleAdapter.invoke(DefaultComponentLifecycleAdapter.java:350)
        at org.mule.component.AbstractJavaComponent.invokeComponentInstance(AbstractJavaComponent.java:86)
        at org.mule.component.AbstractJavaComponent.doInvoke(AbstractJavaComponent.java:77)
        at org.mule.component.AbstractComponent.invokeInternal(AbstractComponent.java:126)
        at org.mule.component.AbstractComponent.access$000(AbstractComponent.java:61)
        at org.mule.component.AbstractComponent$1$1.process(AbstractComponent.java:242)
        at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:99)
        at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:66)
        at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:56)
        at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:66)
        at org.mule.processor.chain.InterceptingChainLifecycleWrapper.process(InterceptingChainLifecycleWrapper.java:87)
        at org.mule.component.AbstractComponent.process(AbstractComponent.java:160)
        at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:99)
        at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:66)
        at org.mule.processor.AbstractInterceptingMessageProcessorBase.processNext(AbstractInterceptingMessageProcessorBase.java:105)
        at org.mule.interceptor.AbstractEnvelopeInterceptor.process(AbstractEnvelopeInterceptor.java:55)
        at org.mule.processor.AsyncInterceptingMessageProcessor.processNextTimed(AsyncInterceptingMessageProcessor.java:111)
        at org.mule.processor.AsyncInterceptingMessageProcessor$AsyncMessageProcessorWorker.doRun(AsyncInterceptingMessageProcessor.java:158)
        at org.mule.work.AbstractMuleEventWork.run(AbstractMuleEventWork.java:43)
        at org.mule.work.WorkerContext.run(WorkerContext.java:310)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)
在网上搜索时,我从Pentaho API示例中找到了这段代码(使用Pentaho 5,但想法保持不变):

所以我会再次得到一个非感官的信息。我已经搜索了javadoc,没有有用的信息可以获得有错误的结果

如何从执行的Pentaho作业的结果中获得正确的错误消息

我正在使用Pentaho 4.3。

可用于从作业执行步骤获取正确的错误消息。 我在自定义Java Api中使用以下代码的目的相同:

    job.waitUntilFinished();
    if (job.getErrors() > 0) {
      Log4jBufferAppender appender = CentralLogStore.getAppender();
      appender.removeGeneralMessages();
      String logText = appender.getBuffer(job.getLogChannelId(), false).toString();
      CentralLogStore.discardLines(job.getLogChannelId(), false);
      throw new RuntimeException(logText);
    } 
错误消息如下所示:

Job-62001 Error in [Processes/SubProcesses/ETL Report Transformation Process.process/Get Record Count]
Running Get_Number_Of_Records Transformation occurred error.
caused by: org.pentaho.di.core.exception.KettleException: 
We failed to initialize at least one step.  Execution can not begin!
    at org.pentaho.di.trans.Trans.prepareExecution(Trans.java:823)
    ...

更多的细节可以在维基上找到。

我在kettle 5中找不到这些方法,如何实现同样的效果?Log4jBufferAppender appender=CentralLogStore.getAppender();
    job.waitUntilFinished();
    if (job.getErrors() > 0) {
      Log4jBufferAppender appender = CentralLogStore.getAppender();
      appender.removeGeneralMessages();
      String logText = appender.getBuffer(job.getLogChannelId(), false).toString();
      CentralLogStore.discardLines(job.getLogChannelId(), false);
      throw new RuntimeException(logText);
    } 
Job-62001 Error in [Processes/SubProcesses/ETL Report Transformation Process.process/Get Record Count]
Running Get_Number_Of_Records Transformation occurred error.
caused by: org.pentaho.di.core.exception.KettleException: 
We failed to initialize at least one step.  Execution can not begin!
    at org.pentaho.di.trans.Trans.prepareExecution(Trans.java:823)
    ...