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 次迭代,它现在按预期工作。谢谢