Apache Camel:如何在" inOnly"之后完成一条路线。儿童路线已经完成了?

时间:2018-04-13 11:31:19

标签: java apache-camel

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

  1. 阅读文件
  2. 将文件拆分为行
  3. 使用BeanIO解组线路
  4. 呼叫(昂贵且耗时)处理器
  5. 我希望在处理完所有行后完成此路线。

    所以我的路线的基本布局如下:

    from("direct:start")
        .pollEnrich("file:..")
        .split(bodyAs(String.class).tokenize(RECORD_DELIMITER))
        .unmarshal(beanIODataFormat)
        .process(doTheWork);
    

    现在我想并行处理doTheWork处理器以加快处理速度,因为此操作是线程安全的,执行顺序无关紧要。

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

    然而,由于我处于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);
    

    但是,如果我这样做,第一条路线一旦将所有消息传递到子路线就会完成。

    有没有办法确保第一条路线只在处理完子路径中的所有邮件后才能完成? 或者我如何实现处理"真正的工作"并行但是顺序执行解组?

1 个答案:

答案 0 :(得分:1)

如果我正确理解您,您可以在第一次拆分时使用AggregationStrategy来创建List<YourBeanIOFormat>,然后进行第二次拆分,您可以并行处理每个单独的对象。< / p>

.split(body())
.parallelProcessing()
.process(doTheWork)

现在,我对Java DSL并不熟悉,所以这在语法上可能不是100%正确,但希望你能得到这个想法。