java - Talend 是 OnComponantOk 线程安全的
问题描述
我有一个关于 Talend 并行性的问题,我正在构建一个 ETL,它可以并行删除多个文件,然后更新一个 db 表。
我的工作运行 tFlowToIterate === 并行迭代 x10 ===> tDelete ===OnComponanantOK===> tDBRow
我的 tDBRow 需要在 tFlowToIterate 中定义的变量才有效!但是我不清楚它为什么起作用的逻辑???Talend 如何确保 tDBrow 在此情况下具有适当的值?
我的理论是 OnCompnanatOk 链接上的 tDBRow 就像一个孩子在 tDelete 迭代下的作品
谁能解释这是如何/为什么起作用的?
解决方案
当 talend 启动一个新线程时,它会创建 globalMap 的副本,您的值在 globalMap 中,因此每个 DBRow 将有自己的 globalMap。(如果您在 globalMap 中存储大量数据,这可能会导致更高的内存使用。)
您需要注意的是另一个方向,因为 globalMap 是写入同步的。因此,如果您在线程内为其设置一个值,它也会被写入父级。在现实生活中,这意味着如果您尝试在 globalMap 中增加一个变量,您的并行线程将看到值 0 并写回 1。因此第 11 步将从 1 开始。
因此,如果你想避免这种情况,(例如 put (hadError, true) 然后稍后检查 hadError,当线程启动时,请确保初始化那些你想在线程中依赖的值。或者如果逻辑更复杂,那么使该子作业成为新作业,因此 globalMap 不会损坏。
推荐阅读
- python - Python:无论我的配置如何,Zeep 总是使用相同的端口向 SOAPUI 服务器发送请求
- java - 需要有关使用 Selenium 和 Jmeter (Java) 进行 webrtc 性能测试的帮助
- sorting - 如何使用 JCL 将单个数据集中的报表拆分为多个数据集
- text - 插入触发器失败后。为什么?
- android - 二进制 XML 文件第 35 行:膨胀类 androidx.viewpager2.widget.ViewPager2 时出错
- terminal - 在 shell 类型的 bin/bash 终端中查找特定文件并获取文件路径
- c# - Selenium/C#:隐藏自动化测试密码的最佳方法?
- python - 当我构建 apk 以从手机运行时,我的 kivy 应用程序崩溃了你可以看看吗?
- npm - windows下安装失败:npm install jsdom
- java - Java hadoop:检查.parquet文件是否包含任何值?