【发布时间】:2016-11-12 21:07:06
【问题描述】:
我有一个使用骆驼路线做一些基本 ETL 的应用程序。每个路由都配置为从一个表中获取一些数据,进行一些转换并将其安全地放入不同模式的同一个表中。 所以骆驼路线和桌子之间是一对一的关系。
假设我有这两条路线:
from("direct:table_1").routeId(table1Route)
.setBody("SELECT * FROM table_1)
.to("jdbc:source_schema").split(body()).streaming()
.process("someProcessor")
.to("sql:INSERT INTO table_1 ... ?dataSource=target_schema");
from("direct:table_2").routeId(table2Route)
.setBody("SELECT * FROM table_2)
.to("jdbc:source_schema").split(body()).streaming()
.process("someProcessor")
.to("sql:INSERT INTO table_2 ... ?dataSource=target_schema");
当向direct:table_1 和direct:table_2 端点发送start processing 消息时,一切运行正常并且数据被移动到目标架构中。
但是查看日志我可以看到表 2 记录仅在表 1 记录完成后才开始移动。这对我的应用程序来说绝对是不行的,因为有些表非常大,一次移动一个表需要很长时间才能运行。
我的问题是我做错了什么,我该如何解决这个问题,以便数据移动并行发生。
【问题讨论】:
-
我不明白为什么如果您并行触发两条路由不应并行执行。如何触发路由?
-
这正是我的想法。向两条路由发送
start-processing将使它们并行运行。即使发送发生相隔纳秒,路由 2 也不会在路由 1 完成之前开始处理。 -
那么您的代码将
start-processing发送到两条路由是从两个不同的线程执行的吗?如果你不使用两个线程,那么路由当然不会并行运行。 -
是因为你在两条路线上使用了相同的 id 吗? routeId(table1Route)
-
没有。那是我修复的复制和粘贴问题。感谢您发现它。
标签: apache-camel