Apache camel 让骆驼路线平行运行

Apache camel 让骆驼路线平行运行,apache-camel,Apache Camel,我有一个应用程序,它使用驼峰路由进行一些基本的ETL。每个路由都配置为从一个表中获取一些数据,进行一些转换,并将其安全地保存到不同模式下的同一个表中。 因此,驼峰路由和表之间存在一对一的关系 假设我有两条路线: from("direct:table_1").routeId(table1Route) .setBody("SELECT * FROM table_1) .to("jdbc:source_schema").split(body()).streaming() .pr

我有一个应用程序,它使用驼峰路由进行一些基本的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记录完成后才开始移动。对于我的应用程序来说,这绝对是不允许的,因为有些表非常大,一次移动一个表需要很长时间才能运行


我的问题是我做错了什么,我如何解决这个问题,以便数据移动并行进行。

我会尝试以下方法:

from("start").multicast().parallelProcessing().to("seda:table1", "seda:table2");
基本上,我有:

  • 使用多播发送到多个收件人,并使用并行处理尝试以并行方式发送到两个端点
  • 我已将您的直接端点替换为seda端点。如果您不需要同步端点,那么改用seda是有益的
  • 您还可以尝试使用多线程的
    .threads()
    语法


    如果要在运行时计算表端点,可以将
    .multicast()
    替换为
    .recipientlist()

    或者,如果使用xml,可以通过以下方式实现:

    <routeContext id="xxxRoute" xmlns="http://camel.apache.org/schema/spring">
        <route id="xxxRouteId">
            <from uri="activemq:queue:{{xxx.queue}}" />
            <multicast parallelProcessing="true">
                <pipeline>
                    <to uri="file://?fileExist=Append"></to>
                </pipeline>
                <pipeline>
                    <to uri="sql:{{sql.xxxx.insertQuery}}"></to>
                </pipeline>
            </multicast>
        </route>
    </routeContext>
    
    
    
    如果您并行触发这两条路由,我不明白为什么这两条路由不应该并行执行。你是怎么触发路线的?我就是这么想的。向两条路由发送
    启动处理
    ,将使它们并行运行。即使发送间隔为纳秒,路由2也不会在路由1完成之前开始处理。因此,向两个路由发送
    开始处理
    的代码是从两个不同的线程执行的?如果您不使用两个线程,那么路由当然不会并行运行。是因为您对两个路由使用相同的id吗?routeId(table1Route)编号。这是我修复的复制粘贴问题。谢谢你发现了,非常感谢。因此,使用
    seda
    是解决方案。似乎我对direct的用途有误解。在我看来,direct的行为就像一个队列,它的行为就像内存中的队列,但默认情况下,它的行为比seda更同步,seda是异步的。当您希望与上下文之外的端点通信时,还可以使用vm和direct vm端点。