Talend中从Job1调用Job2时全局上下文变量值为NULL问题咨询
排查Talend中Job调用时全局上下文变量默认值失效的问题
嘿,这个问题我在项目里碰到过好多次,Talend调用子作业时上下文默认值变null的坑其实很好踩,咱们一步步排查:
检查
tRunJob的上下文传递配置
你应该是用tRunJob组件调用Job2的吧?打开这个组件的「Context」标签页,重点看上下文传递的选项:- 如果选了「Transmit whole context」或者「Transmit selected context variables」,父作业Job1里如果没给这个全局变量赋值,就会把
null传递给Job2,直接覆盖它的默认值。 - 正确的做法应该是选择「Use default values of child Job」,这样Job2会优先使用自己定义的全局上下文默认值,而不是继承父作业的空值。
- 如果选了「Transmit whole context」或者「Transmit selected context variables」,父作业Job1里如果没给这个全局变量赋值,就会把
确认全局上下文变量的定义层级
要区分项目级全局上下文和作业级上下文:- 如果你的变量是在项目级Context(Talend Studio左侧的「Contexts」节点)定义的,并且设置了默认值,那所有作业都能共享这个默认值;但如果父作业Job1里重新定义了同名变量且未赋值,还是会覆盖。
- 如果只是在Job2的本地上下文里定义的默认值,当被Job1调用时,除非明确指定使用子作业默认值,否则会被父作业的上下文覆盖。
排查父作业是否存在同名变量覆盖
去Job1的上下文配置里看看,有没有和Job2那个全局变量同名的变量?如果有,而且Job1里这个变量没有赋值(默认是null),那么通过tRunJob传递时就会把这个null传给Job2,导致默认值失效。这时候要么给Job1里的变量也设置相同的默认值,要么在tRunJob的上下文传递里排除这个变量。加日志调试确认变量值
最直接的方式是在Job2的开头加一个tLogRow组件,把所有上下文变量打印出来(可以选「Print all columns」或者指定要查看的变量)。同时在Job1调用Job2之前,也加一个tLogRow打印父作业的变量值,这样就能清楚看到是父作业传了null,还是子作业没加载到默认值。Talend版本兼容性检查
虽然概率不高,但某些较旧的Talend版本(比如6.0之前)在上下文传递逻辑上有bug,如果前面的排查都没问题,可以考虑升级到稳定的新版本(比如7.x或8.x)试试。
按照这个顺序排查,大概率能找到问题所在,我之前就是靠调整tRunJob的上下文配置解决了类似的问题~
内容的提问来源于stack exchange,提问作者Rajesh
相关产品推荐
相关产品推荐

