Talend ETL-在tLoop中运行子作业

时间:2018-07-25 14:13:41

标签: talend

我正在尝试在tLoop中运行子级作业。子作业连接到salesforce,并将“ Account”对象下载到本地SQL Server表。与Salesforce的连接存在问题,几乎不需要尝试进行连接。因此,我将连接内容放入子作业中,现在尝试循环调用子作业。下面是我父母工作的照片。

enter image description here

如您在图像中所见,由于子作业中的Salesforce连接问题,tRunJob_1出现错误。这是正确的行为。

连接到OnComponentError的setRetryConnect具有以下代码:context.retryConnect = true;

连接到OnComponentOk的setRetryConnect具有以下代码:context.retryConnect = false;

因此,我根据子作业是成功还是失败来触发此上下文变量。

我的tLoop如下:

enter image description here

我希望tLoop运行多次,直到条件保持为真为止。直到它继续出错为止。但是,它只迭代一次然后停止。谁能让我知道在这里需要进行哪些更正才能使tLoop正常工作?

2 个答案:

答案 0 :(得分:0)

我无法用SalesForce来解决您的问题,但是通过查看您的工作,我的感觉是,当您说-“先迭代一次然后停止”是您的预期行为。

根据tRunJob之后的作业流程,您正在使用OnComponentOk/OnComponentError触发器,该触发器将处理和停止作业运行,因为它将完成作业执行。理想的做法是将所有内容保存在subjob帖子tLoop中,以便迭代直到满足条件。

示例工作说明- enter image description here

这里使用tSetGlobalVar定义了一个全局变量(代替上下文变量)。然后在((Boolean)globalMap.get("tLoop"))的“条件”中将globalMap变量用作tLoop

然后最后在tJava组件中运行一些代码,该代码可以执行某些操作,并有条件地将全局变量设置为false,以标记循环的结束。 tRunJob提供了返回码((Integer)globalMap.get("tRunJob_1_CHILD_RETURN_CODE")) 如果您要多次运行子Job,并且如果其中一次迭代失败,则希望Job以非零值退出,那么在每次迭代之后,您应该测试此返回码并将其存储在自己的globalMap Object中不为零

int returnCode = ((Integer)globalMap.get("tRunJob_1_CHILD_RETURN_CODE"));
if (returnCode > 0) {
    globalMap.put("tLoop", false);
} 
else {
    System.out.println(returnCode);
};

答案 1 :(得分:0)

亲自找到答案,然后将其发布在这里,以便对他人有所帮助。看起来OnComponentError破坏了tLoop。禁用OnComponentError流,并在tRunJob中取消选中“ Die on Child Error”复选框。

parent job

tRunJob

tLoop保持原样。这里没有变化。

tLoop

retryConnect将使用以下代码。它使用CHILD_RETURN_CODE检查子作业是否抛出错误。如果成功,则其值为0。当子作业成功时,我将触发该变量,因此循环将停止。如您所见,tLoop显示了2次迭代,它现在按预期工作。谢谢。

retryConnect