kettle中错误处理
目录
一、图文说明
在如上图中,有定义一个tableOutputError,如果在select节点发生错误,那么就将进入此tableOutputError,将错误数据输出到表。
但是如果是tableOutput处发生了错误,那么就无法进行错误处理了,后面没有定义错误处理。
界面选择错误处理如下,
只有有定义错误处理选项的才能错误处理,一般是输出节点,像tableInput就无法错误处理,因为是输入步骤。
二、 错误处理代码
StepErrorMeta stepErrorMeta = new StepErrorMeta(null,selectStep,tableOutputErrorStep);
stepErrorMeta.setEnabled(true);
selectStep.setStepErrorMeta(stepErrorMeta);
tableOutputErrorStep.setStepErrorMeta(stepErrorMeta);
如上所示,需要定义一个StepErrorMeta对象,这就是错误处理步骤,同时还需要设置enabled,否则错误处理不启用。
StepErrorMeta构造器的第二个参数是sourceStep,第三个参数是targetStep。
上述的图片整体代码
/**
* 错误处理
* @throws KettleException
*/
@Test
public void exchangeMysql2Mysql() throws KettleException{
/*
1. 源数据库连接
*/
String mysql_src = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<connection>" +
"<name>mysql_src</name>" +
"<server>192.168.10.64</server>" +
"<type>MySQL</type>" +
"<access>Native</access>" +
"<database>test</database>" +
"<port>3306</port>" +
"<username>root</username>" +
"<password>root</password>" +
"</connection>";
/*
2. 目标数据库连接
*/
String mysql_dest = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<connection>" +
"<name>mysql_dest</name>" +
"<server>192.168.10.64</server>" +
"<type>MySQL</type>" +
"<access>Native</access>" +
"<database>test</database>" +
"<port>3306</port>" +
"<username>root</username>" +
"<password>root</password>" +
"</connection>";
DatabaseMeta srcDatabaseMeta = new DatabaseMeta(mysql_src);
DatabaseMeta destDatabaseMeta = new DatabaseMeta(mysql_dest);
//创建转换元信息
TransMeta transMeta = new TransMeta();
transMeta.setName("mysql8之间的交换");
//设置源和目标
transMeta.addDatabase(srcDatabaseMeta);
transMeta.addDatabase(destDatabaseMeta);
/*
* 创建 表输入->选择-->表输出/错误输出
* 同时将两个步骤连接起来
*/
PluginRegistry registry = PluginRegistry.getInstance();
/*
3. 表输入
*/
TableInputMeta tableInputMeta = new TableInputMeta();
String tableInputPluginId = registry.getPluginId(StepPluginType.class,
tableInputMeta);
tableInputMeta.setDatabaseMeta(srcDatabaseMeta);
//设置查询条件
String selectSql = "select id ,name from user_info_src";
tableInputMeta.setSQL(selectSql);
StepMeta tableInputStepMeta = new StepMeta(tableInputPluginId,
"tableInput", (StepMetaInterface) tableInputMeta);
//给步骤添加在spoon工具中的显示位置
tableInputStepMeta.setDraw(true);
tableInputStepMeta.setLocation(100, 100);
transMeta.addStep(tableInputStepMeta);
/*
4. 定义字段选择器
*/
SelectValuesMeta selectValuesMeta = new SelectValuesMeta();
selectValuesMeta.allocate(2,0,0);
String[] fields = new String[]{"id","name"};
selectValuesMeta.setSelectName(fields);
selectValuesMeta.setSelectRename(fields);
String selectPluginId = registry.getPluginId(StepPluginType.class, selectValuesMeta);
StepMeta selectStep = new StepMeta(selectPluginId, "select", (StepMetaInterface) selectValuesMeta);
//给步骤添加在spoon工具中的显示位置
selectStep.setDraw(true);
selectStep.setLocation(100, 200);
//将步骤添加进去
transMeta.addStep(selectStep);
transMeta.addTransHop(new TransHopMeta(tableInputStepMeta, selectStep));
/*
5. 定义错误输出
*/
TableOutputMeta tableOutputErrorMeta = new TableOutputMeta();
tableOutputErrorMeta.setDatabaseMeta(destDatabaseMeta);
//设置目标表的 schema和表名
tableOutputErrorMeta.setSchemaName(null);
tableOutputErrorMeta.setTablename("user_info_dest_error");
String tableOutputErrorPluginId = registry.getPluginId(StepPluginType.class, tableOutputErrorMeta);
StepMeta tableOutputErrorStep = new StepMeta(tableOutputErrorPluginId, "tableOutputError", (StepMetaInterface) tableOutputErrorMeta);
//将步骤添加进去
transMeta.addStep(tableOutputErrorStep);
//给步骤添加在spoon工具中的显示位置
tableOutputErrorStep.setDraw(true);
tableOutputErrorStep.setLocation(300, 300);
/*
6. 定义正常输出
*/
TableOutputMeta tableOutputMeta = new TableOutputMeta();
tableOutputMeta.setDatabaseMeta(destDatabaseMeta);
//设置目标表的 schema和表名
tableOutputMeta.setSchemaName(null);
tableOutputMeta.setTablename("user_info_dest");
String tableOutputPluginId = registry.getPluginId(StepPluginType.class, tableOutputMeta);
StepMeta tableOutputStep = new StepMeta(tableOutputPluginId, "tableOutput", (StepMetaInterface) tableOutputMeta);
//将步骤添加进去
transMeta.addStep(tableOutputStep);
//给步骤添加在spoon工具中的显示位置
tableOutputStep.setDraw(true);
tableOutputStep.setLocation(200, 200);
StepErrorMeta stepErrorMeta = new StepErrorMeta(null,selectStep,tableOutputErrorStep);
stepErrorMeta.setEnabled(true);
selectStep.setStepErrorMeta(stepErrorMeta);
tableOutputErrorStep.setStepErrorMeta(stepErrorMeta);
/*
7. 将步骤关联
*/
transMeta.addTransHop(new TransHopMeta(selectStep, tableOutputStep));
transMeta.addTransHop(new TransHopMeta(selectStep, tableOutputErrorStep));
String xml = transMeta.getXML();
System.out.println(xml);
// Trans trans = new Trans(transMeta);
//
//
// //执行转换
// trans.execute(null);
//
// //等待完成
// trans.waitUntilFinished();
// if (trans.getErrors() > 0) {
// System.out.println("交换出错.");
// return;
// }
}
三、扩展
图片说明
定义一个tableInput和tableOutput,如果插入到tableOutput中数据出错,那么就进入tableOutputError处理。
源表:
CREATE TABLE `user_info_src` (
`id` varchar(36) NOT NULL,
`name` varchar(36) DEFAULT NULL,
PRIMARY KEY (`id`)
)
目标表:
CREATE TABLE `user_info_dest` (
`id` varchar(36) NOT NULL,
`name` varchar(36) DEFAULT NULL,
PRIMARY KEY (`id`)
)
目标表定义了主键,这样第一次执行时,源表数据进入user_info_dest,第二次执行就会主键冲突。
异常数据表:
CREATE TABLE `user_info_dest_error` (
`id` varchar(36) NOT NULL,
`name` varchar(36) DEFAULT NULL
)
当第二次执行时,插入到user_info_dest中主键冲突,所以就会进入user_info_dest_error中,第一次执行数据是进入user_info_dest中。
完整代码
/**
* Mysql之间的交换
* @throws KettleException
*/
@Test
public void exchangeMysql2MysqlErrorStep() throws KettleException{
/*
1. 源数据库连接
*/
String mysql_src = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<connection>" +
"<name>mysql_src</name>" +
"<server>192.168.10.64</server>" +
"<type>MySQL</type>" +
"<access>Native</access>" +
"<database>test</database>" +
"<port>3306</port>" +
"<username>root</username>" +
"<password>root</password>" +
"</connection>";
/*
2. 目标数据库连接
*/
String mysql_dest = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<connection>" +
"<name>mysql_dest</name>" +
"<server>192.168.10.64</server>" +
"<type>MySQL</type>" +
"<access>Native</access>" +
"<database>test</database>" +
"<port>3306</port>" +
"<username>root</username>" +
"<password>root</password>" +
"</connection>";
DatabaseMeta srcDatabaseMeta = new DatabaseMeta(mysql_src);
DatabaseMeta destDatabaseMeta = new DatabaseMeta(mysql_dest);
//创建转换元信息
TransMeta transMeta = new TransMeta();
transMeta.setName("mysql8之间的交换");
//设置源和目标
transMeta.addDatabase(srcDatabaseMeta);
transMeta.addDatabase(destDatabaseMeta);
/*
* 创建 表输入->选择-->表输出/错误输出
* 同时将两个步骤连接起来
*/
PluginRegistry registry = PluginRegistry.getInstance();
/*
3. 表输入
*/
TableInputMeta tableInputMeta = new TableInputMeta();
String tableInputPluginId = registry.getPluginId(StepPluginType.class,
tableInputMeta);
tableInputMeta.setDatabaseMeta(srcDatabaseMeta);
//设置查询条件
String selectSql = "select id ,name from user_info_src";
tableInputMeta.setSQL(selectSql);
StepMeta tableInputStepMeta = new StepMeta(tableInputPluginId,
"tableInput", (StepMetaInterface) tableInputMeta);
//给步骤添加在spoon工具中的显示位置
tableInputStepMeta.setDraw(true);
tableInputStepMeta.setLocation(100, 100);
transMeta.addStep(tableInputStepMeta);
/*
4. 定义正常输出
*/
TableOutputMeta tableOutputMeta = new TableOutputMeta();
tableOutputMeta.setDatabaseMeta(destDatabaseMeta);
//设置目标表的 schema和表名
tableOutputMeta.setSchemaName(null);
tableOutputMeta.setTablename("user_info_dest");
String tableOutputPluginId = registry.getPluginId(StepPluginType.class, tableOutputMeta);
StepMeta tableOutputStep = new StepMeta(tableOutputPluginId, "tableOutput", (StepMetaInterface) tableOutputMeta);
//将步骤添加进去
transMeta.addStep(tableOutputStep);
transMeta.addTransHop(new TransHopMeta(tableInputStepMeta, tableOutputStep));
//给步骤添加在spoon工具中的显示位置
tableOutputStep.setDraw(true);
tableOutputStep.setLocation(200, 200);
/*
5. 定义错误输出
*/
TableOutputMeta tableOutputErrorMeta = new TableOutputMeta();
tableOutputErrorMeta.setDatabaseMeta(destDatabaseMeta);
//设置目标表的 schema和表名
tableOutputErrorMeta.setSchemaName(null);
tableOutputErrorMeta.setTablename("user_info_dest_error");
String tableOutputErrorPluginId = registry.getPluginId(StepPluginType.class, tableOutputErrorMeta);
StepMeta tableOutputErrorStep = new StepMeta(tableOutputErrorPluginId, "tableOutputError", (StepMetaInterface) tableOutputErrorMeta);
//将步骤添加进去
transMeta.addStep(tableOutputErrorStep);
transMeta.addTransHop(new TransHopMeta(tableOutputStep, tableOutputErrorStep));
//给步骤添加在spoon工具中的显示位置
tableOutputErrorStep.setDraw(true);
tableOutputErrorStep.setLocation(300, 300);
/*
6.定义错误数据流输出
*/
StepErrorMeta stepErrorMeta = new StepErrorMeta(null,tableOutputStep,tableOutputErrorStep);
stepErrorMeta.setEnabled(true);
tableOutputStep.setStepErrorMeta(stepErrorMeta);
tableOutputErrorStep.setStepErrorMeta(stepErrorMeta);
/*
7. 输出xml,在spoon中展示图形化
*/
String xml = transMeta.getXML();
System.out.println(xml);
}