我有一个应用程序使用骆驼路线做一些基本的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");
一切运行正常,并发送start processing
消息既direct:table_1
和direct:table_2
终点时,数据被移动到目标模式。
但是看看日志我可以看到表2记录开始只在表1记录完成后才移动。对于我的应用程序来说,这绝对是不可能的,因为一些表格相当大,而且一次移动一个表格需要很长时间才能运行。
我的问题是我做错了什么,我该如何解决这个问题,以便数据移动并行发生。
我不明白为什么这两个如果并行触发它们,路由不应并行执行。你如何触发路线? – Ralf
这正是我的想法。向两条路线发送“启动处理”将使它们并行运行。即使发送发生了几纳秒,路由2在路由1完成之前也不会开始处理。 – Julian
因此,你的代码发送一个'开始处理'到两条路由是这样从两个不同的线程?如果你不使用两个线程,那么这些路由当然不会并行运行。 – Ralf