【发布时间】:2018-01-19 07:02:52
【问题描述】:
我使用 Talend 开发了一些作业,并使用 Tlogcatcher 在数据库中记录错误。它似乎适用于除一项以外的所有工作。
这是它的工作原理:
第一个 SQL 连接从数据库表中读取 SQL 语句,并且对于每个 SQL 语句,tMSSqlRow 读取并执行它。
但是当 SQL 失败时(即删除不可能导致约束完整性的原因),错误不会被 tLogCatcher 组件捕获。
我该怎么做?
【问题讨论】:
我使用 Talend 开发了一些作业,并使用 Tlogcatcher 在数据库中记录错误。它似乎适用于除一项以外的所有工作。
这是它的工作原理:
第一个 SQL 连接从数据库表中读取 SQL 语句,并且对于每个 SQL 语句,tMSSqlRow 读取并执行它。
但是当 SQL 失败时(即删除不可能导致约束完整性的原因),错误不会被 tLogCatcher 组件捕获。
我该怎么做?
【问题讨论】:
tLogCatcher 不应该像您在工作中那样使用(使用OnComponentError/OnSubjobError 触发器),它必须是独立子作业(未通过触发器链接)的第一个组件每当出现错误/警告/java 异常时调用,具体取决于您在 tLogCatcher 设置中检查的类型。
如果要保留OnComponentError 触发器,可以完全省略tLogCatcher,只在OnComponentError 触发的子作业中进行错误处理。
此外,请确保您在 tMSSqlRow 组件中选中“Die on error”选项,否则不会引发错误,并且作业只会将错误消息打印到控制台并继续执行,因此不会调用 tLogCatcher。
编辑:
根据您的要求(在出现错误时继续执行作业),一种解决方案是将从 tMSSqlRow 开始发生的处理(以及我上面建议的错误处理技术)封装在子作业中。
此子作业需要定义一个上下文参数(例如 QUERY)并针对此单个查询进行处理。父作业使用Iterate 触发器调用此子作业,并通过QUERY 上下文参数将要处理的每个查询传递给它(tFlowToIterate 中的全局变量将传递给@987654333 中的QUERY 上下文参数@ 参数选项卡)。
这样,如果您在子作业中的查询处理导致错误,则由tLogCatcher 在子作业内部进行处理,而父作业不会意识到此错误,因此会继续进行下一个查询。
【讨论】: