Talend ETL - tLoop 中的 运行 child 作业
Talend ETL - running child job in tLoop
我正在尝试 运行 tLoop 中的 child 工作。 child 作业连接到 salesforce 并将“帐户”object 下载到本地 SQL 服务器 table。与 Salesforce 的连接存在问题,连接尝试次数很少。因此,我将连接内容放在 child 作业中,现在尝试循环调用 child 作业。下面是我的 parent 工作的图片。
正如您在图片中看到的那样,tRunJob_1 由于 child 作业中的 Salesforce 连接问题而出现错误。这是正确的行为。
连接到 OnComponentError 的 setRetryConnect 有这个代码:context.retryConnect = true;
连接到OnComponentOk的setRetryConnect有这样的代码:context.retryConnect = false;
因此,我根据 child 作业是成功还是失败来触发此上下文变量。
我的 tLoop 如下所示:
我希望 tLoop 运行 多次,直到条件保持为真。直到它继续出错为止。但是,它只迭代一次然后停止。任何人都可以让我知道这里需要做什么修正才能使 tLoop 正常工作吗?
我无法用 SalesForce
重新解决你的问题,但通过查看你的工作,我觉得当你说 - "it just iterates once and then stops" 是预期的行为时。
根据您在 tRunJob
之后的作业流程,您正在使用 OnComponentOk/OnComponentError
触发器,它将处理并停止作业 运行,因为它会完成作业执行。理想的是将所有内容都保存在 subjob
post tLoop
中,以便它会迭代直到满足条件。
用于解释的示例作业 -
此处使用 tSetGlobalVar
定义全局变量(代替您的上下文变量)。然后在 tLoop
的 "Condition" 中使用 globalMap 变量作为 ((Boolean)globalMap.get("tLoop"))
。
然后最后 运行 tJava
组件中的一些代码执行某些操作并有条件地将全局变量设置为 false 以标记循环结束。
tRunJob
提供 Return 代码 ((Integer)globalMap.get("tRunJob_1_CHILD_RETURN_CODE"))
如果您 运行 多次使用您的子 Job 并希望您的 Job 在其中一次迭代失败时以非零值退出,那么在每次迭代之后,您应该测试此 return 代码并如果它是非零的,则将其存储在您自己的 globalMap 对象中
int returnCode = ((Integer)globalMap.get("tRunJob_1_CHILD_RETURN_CODE"));
if (returnCode > 0) {
globalMap.put("tLoop", false);
}
else {
System.out.println(returnCode);
};
自己找到了答案,将其张贴在这里,以便对其他人有所帮助。看起来 OnComponentError 打破了 tLoop。禁用 OnComponentError 流程并取消选中 tRunJob 中的 'Die on Child Error' 复选框。
tLoop 保持原样。这里没有变化。
retryConnect 将使用以下代码。它使用 CHILD_RETURN_CODE 检查子作业是否抛出错误。如果成功,它的值为 0。我在子作业成功时触发变量,因此循环将停止。如您所见,tLoop 显示了 2 次迭代,它现在按预期工作。谢谢
我正在尝试 运行 tLoop 中的 child 工作。 child 作业连接到 salesforce 并将“帐户”object 下载到本地 SQL 服务器 table。与 Salesforce 的连接存在问题,连接尝试次数很少。因此,我将连接内容放在 child 作业中,现在尝试循环调用 child 作业。下面是我的 parent 工作的图片。
正如您在图片中看到的那样,tRunJob_1 由于 child 作业中的 Salesforce 连接问题而出现错误。这是正确的行为。
连接到 OnComponentError 的 setRetryConnect 有这个代码:context.retryConnect = true;
连接到OnComponentOk的setRetryConnect有这样的代码:context.retryConnect = false;
因此,我根据 child 作业是成功还是失败来触发此上下文变量。
我的 tLoop 如下所示:
我希望 tLoop 运行 多次,直到条件保持为真。直到它继续出错为止。但是,它只迭代一次然后停止。任何人都可以让我知道这里需要做什么修正才能使 tLoop 正常工作吗?
我无法用 SalesForce
重新解决你的问题,但通过查看你的工作,我觉得当你说 - "it just iterates once and then stops" 是预期的行为时。
根据您在 tRunJob
之后的作业流程,您正在使用 OnComponentOk/OnComponentError
触发器,它将处理并停止作业 运行,因为它会完成作业执行。理想的是将所有内容都保存在 subjob
post tLoop
中,以便它会迭代直到满足条件。
用于解释的示例作业 -
此处使用 tSetGlobalVar
定义全局变量(代替您的上下文变量)。然后在 tLoop
的 "Condition" 中使用 globalMap 变量作为 ((Boolean)globalMap.get("tLoop"))
。
然后最后 运行 tJava
组件中的一些代码执行某些操作并有条件地将全局变量设置为 false 以标记循环结束。
tRunJob
提供 Return 代码 ((Integer)globalMap.get("tRunJob_1_CHILD_RETURN_CODE"))
如果您 运行 多次使用您的子 Job 并希望您的 Job 在其中一次迭代失败时以非零值退出,那么在每次迭代之后,您应该测试此 return 代码并如果它是非零的,则将其存储在您自己的 globalMap 对象中
int returnCode = ((Integer)globalMap.get("tRunJob_1_CHILD_RETURN_CODE"));
if (returnCode > 0) {
globalMap.put("tLoop", false);
}
else {
System.out.println(returnCode);
};
自己找到了答案,将其张贴在这里,以便对其他人有所帮助。看起来 OnComponentError 打破了 tLoop。禁用 OnComponentError 流程并取消选中 tRunJob 中的 'Die on Child Error' 复选框。
tLoop 保持原样。这里没有变化。
retryConnect 将使用以下代码。它使用 CHILD_RETURN_CODE 检查子作业是否抛出错误。如果成功,它的值为 0。我在子作业成功时触发变量,因此循环将停止。如您所见,tLoop 显示了 2 次迭代,它现在按预期工作。谢谢