Java ApacheCamel:如何在一个;inOnly";儿童路线已经完成?

Java ApacheCamel:如何在一个;inOnly";儿童路线已经完成?,java,apache-camel,Java,Apache Camel,我想创建一个执行以下步骤的路由 读取文件 将文件拆分为行 使用BeanIO解组行 呼叫(昂贵且耗时)处理器 我想在处理完所有线路后完成这条路线 因此,我的路线的基本布局如下所示: from("direct:start") .pollEnrich("file:..") .split(bodyAs(String.class).tokenize(RECORD_DELIMITER)) .unmarshal(beanIODataFormat) .process(doTheW

我想创建一个执行以下步骤的路由

  • 读取文件
  • 将文件拆分为行
  • 使用BeanIO解组行
  • 呼叫(昂贵且耗时)处理器
  • 我想在处理完所有线路后完成这条路线

    因此,我的路线的基本布局如下所示:

    from("direct:start")
        .pollEnrich("file:..")
        .split(bodyAs(String.class).tokenize(RECORD_DELIMITER))
        .unmarshal(beanIODataFormat)
        .process(doTheWork);
    
    现在我想并行化
    doTheWork
    处理器,以加快处理速度,因为此操作是线程安全的,执行顺序无关紧要

    最简单的方法是通过添加
    .parallelProcessing()
    来并行化拆分器,但是,这是不可能的,因为BeanIO处理不是线程安全的(请参阅)。因此,我希望解组同步完成,然后开始并行处理

    但是,由于我处于InOut/Request-Reply交换模式,我不能将SEDA组件与多个处理器一起使用,因为拆分器将等待当前子消息被完全处理,然后将下一行作为子消息发送

    相反,我必须以异步inOnly请求的形式发送消息,以便“鼓励”拆分器发送下一行:

    from("direct:start")
        .pollEnrich("file:..")
        .split(bodyAs(String.class).tokenize(""))
        .unmarshal((DataFormatDefinition)null)
        .inOnly("seda:child");
    
    from("seda:child?concurrentConsumers=5")
        .process(doTheWork);
    
    但是,如果我这样做,第一条路由在将所有消息传递给子路由后立即完成

    有没有办法确保第一条路由只有在子路由中的所有消息都处理完毕后才能完成?
    或者,我如何实现并行处理“实际工作”,但按顺序执行解组?

    如果我理解正确,您可以在第一次拆分时使用
    聚合策略创建
    列表,然后进行第二次拆分,您可以并行处理每个单独的对象

    .split(body())
    .parallelProcessing()
    .process(doTheWork)
    
    现在,我对JavaDSL不太熟悉,所以这在语法上可能不是100%正确,但希望您能理解