在Pentaho

时间:2016-03-10 15:03:50

标签: java swing pentaho

我正从SSIS搬到Pentaho,这也是java的新手。我想要做的是使用Defined Java Class步骤(或另一个)在Pentaho中显示一个简单的消息框。

首先我尝试使用此代码:

import javax.swing.JOptionPane;

public class MyClass 
{
    public static void main(String args[]){
    JOptionPane.showMessageDialog(null,"Hello, this message is in a message type box." );
    System.exit(0);
    }
}

但我收到了这个错误:

Non-abstract class "Processor" must implement method "boolean org.pentaho.di.trans.steps.userdefinedjavaclass.TransformClassBase.processRow

我修改了代码:

导入javax.swing.JOptionPane;

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException

    {
        JOptionPane.showMessageDialog(null,"Hello world!");
        System.exit(0);

        return true;

    }

我测试了这个类,我没有收到任何错误消息,但是我看不到我期待的消息框。

所以,我的问题是,我还需要导入,指定或修改以实现我想要做的事情。

问候。

1 个答案:

答案 0 :(得分:2)

在pdi转换中,大多数步骤都需要一些输入。您的每个行都会调用您的processRow()方法,由您的用户定义的Java类步骤接收。因此,如果您没有输入行 - 则不会调用该方法。

您可能需要放置一些步骤,先生成一行并将输出传递给java步骤。您可以使用"检测空流"步骤 - 它将输出恰好一行而没有任何列。但是,你的java代码仍然需要进行一些调整(不确定你在java中需要做什么,但似乎你需要创建一些)。

所以,最简单的选项就是使用"修改的Java脚本值" (它使用Rhino javascript,而不是java)步骤并在里面调用Alert("Hello world!")函数。但是你仍然需要一个输入行。

如果您仍想以java方式执行,您可以尝试使用代码(但我不是Java开发人员,因此我不确定该代码有多好):

import javax.swing.*;

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{

    Object[] r = getRow();
    if (r == null) {
        setOutputDone();
        return false;
    }

    if (first)
    {
        first = false;
        myFrame = new MyFrame();
//      myFrame.setVisible(true);
        JOptionPane.showMessageDialog(myFrame, "Hello world");
        myFrame.dispose();
    }

    return true;
}

private MyFrame myFrame;

private class MyFrame extends JFrame {
    public MyFrame() {
        super();
//      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

另外,请记住,水壶作业/转换通常不应该是交互式的。它们可能在linux系统上执行,而linux系统可能没有窗口系统。 因此,显示此类消息通常仅用于调试,并在生产版本中禁用。