我正从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;
}
我测试了这个类,我没有收到任何错误消息,但是我看不到我期待的消息框。
所以,我的问题是,我还需要导入,指定或修改以实现我想要做的事情。
问候。
答案 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系统可能没有窗口系统。 因此,显示此类消息通常仅用于调试,并在生产版本中禁用。