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);
	}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值