Kettle组件错误处理
Kettle于2.4.1-M1版本引入错误处理特性。如下图所示,支持错误处理的组件可以向后拖拽出一条红色的线条。当出现错误数据时不会抛出异常终止step,而是将出错行沿着红线向后发送。
右击组件选择Define error handling…(或者单击红色错误连线上的叉图标),打开错误处理设置界面:
主要配置项:
- nrErros: (本轮)发生错误行数,绝大多数组件为1
- errorDescription: 错误堆栈信息
- errorField: 错误列名;本例中为空因为在表输出组件实现中,jdbc发生错误时没有办法通过JDBC Driver获取具体的出错数据库列名。其他组件是否有值取决于具体的后台实现。
- errorCode: 错误码,由组件约定;比如表输出组件的TOP001表示常规数据库错误
Note: 这四个列会被后续组件获取到
组件开发:支持错误处理
- 在组件Meta实现类中覆盖基类中的supportsErrorHandling()方法,返回true
- 后台逻辑实现
通过一个boolean变量标记组件是否启用错误处理模式(后面连着红线),可在构造方法中初始化1
boolean sendToErrorRow = getStepMeta().isDoingErrorHandling();
在行处理逻辑附近,catch块中进行putError()的调用1
2
3
4
5
6
7
8
9if(sendToErrorRow) {
putError( getInputRowMeta(), r, 1, e.toString(), null, "ExchangeFileInput001" );
} else {
logError( BaseMessages.getString(PKG, "ExchangeFile.ErrorInStepRunning", e.getMessage()) );
setErrors( 1 );
stopAll();
setOutputDone(); // signal end to receiver(s)
return false;
}