【问题标题】:Apache Camel split and aggregate exception handlingApache Camel 拆分和聚合异常处理
【发布时间】:2017-01-20 12:24:00
【问题描述】:

我们在 Camel 中定义了一个具有拆分和聚合功能的路由,但无法在聚合器之后将异常传播回拆分。即使我们遇到异常,哪个原因是拆分运行

下面是不工作的代码

from("direct:MyRoute")
     .routeId("MyRouteID")
        .split().tokenize("\n", 1)
        .streaming().stopOnException()
        .choice()
        .when(simple("${property.CamelSplitIndex} > 0"))
           .unmarshal(domainDataFormat)
           .choice()
           .when(simple("${property.CamelSplitComplete}"))
           .process(
              new Processor()
              {
                 @Override
                 public void process(Exchange exchange) throws Exception
                 {
                    exchange.getIn().getHeaders().put(Exchange.AGGREGATION_COMPLETE_ALL_GROUPS_INCLUSIVE, true);
                 }
              }
           )
           .end()
           .aggregate(myAggregationStrategy).constant(true) //if i comment this line split will be stop on exception
           .threads().executorService(executorService)
           .process(myProcessor).end()
     .end();

上面代码中的处理器(myProcessor)如下:

counter.incrementAndGet(); //atomic counter 
if(counter.get()==3)
  {
     exchange.setException(new RuntimeException());
     throw new RuntimeCamelException();
  }

但是,当我从路由中删除聚合时,Split 能够在异常时停止路由。

【问题讨论】:

    标签: apache-camel


    【解决方案1】:

    在同一工作单元中使用拆分 + 聚合(fork/join)的复合消息处理器 EIP。

    请参阅文档:http://camel.apache.org/composed-message-processor.html

    并查看仅拆分器部分,您可以在其中为拆分器指定聚合策略以使其协同工作。

    【讨论】:

    • 感谢克劳斯的回复。如您所见,我们在聚合调用之前使用了 .streaming 和 .unmarshal 。我们无法通过拆分 + 聚合来实现这一点。还有其他办法吗?
    • 您可以继续这样做,只需删除聚合并将 agg 策略添加到拆分器,您不需要任何逻辑来检查拆分完成等。如果您有 Camel in Action 这本书,请在那里阅读有关这些模式的信息,因为它包含更多详细信息
    • 嗨克劳斯,让我解释一下我们如何在我们的需求中使用它。我们正在使用上面解释的路由处理巨大的平面固定长度文件,因此一般流程将逐行拆分文件,流式传输,然后解组以从中获取 POJO(使用绑定)聚合一个块(在一些相关的键)并在处理器中处理这些块(多线程)但这对于 split+ 聚合是不可能的,因为它不会帮助我在聚合之前和拆分之后进行解组和流式传输。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多