Hi, 

I tried to. But the messages I get in aggregate(old, new) or different and 
don’t have the information anymore.
And the aggregate-method with three params is never called. 

@Override
  public Exchange aggregate(Exchange oldExchange, Exchange newExchange, 
Exchange inputExchange) {
    return aggregate(oldExchange, newExchange);
  }

Or I put the original message to message header?

Thomas


-----Ursprüngliche Nachricht-----
Von: Claus Ibsen <claus.ib...@gmail.com> 
Gesendet: Montag, 16. Dezember 2019 06:35
An: users@camel.apache.org
Betreff: Re: Aggregation and unitOfWork

Hi

The output of the aggregate is not tied to any of its input, its a separate new 
exchange, so they dont' share any unit of work etc.
So the data you want as output from the aggregator, you must then add via the 
aggregation strategy

On Thu, Dec 12, 2019 at 2:56 PM <thomas.thi...@telekom.de> wrote:
>
> Hi,
>
> Aggration seems to lost the connection to original Message.
>
> I have the following construct:
>
> from(FILE_IN_URI)
>       .split(new ZipSplitter()).shareUnitOfWork()
>           .streaming()
>           .choice()
>                .when(simple("${in.header.CamelFileName} ends with 'xml'"))
>                    .process(exchange -> {
>                           System.out.println("debug exchange"); -> throw 
> EXCEPTION 1
>                     })
>                    .to(EP_AGGREGATION)
>                .endChoice()
>               .otherwise()
>                   .to(FILE_OUT_URI)
>                    .process(exchange -> {
>                           System.out.println("debug exchange");    -> throw 
> EXCEPTION 2
>                     })
>                   .to(EP_AGGREGATION)
>               .endChoice()
>           .end()
>        .end()
> ;
>
> from(EP_AGGREGATION_)
>        .aggregate(header("foo"), new ThomasAggregationStrategy())
>         .completionTimeout(10 * 1000)
>         .completion(header("bar").isEqualTo(true))
>         .process(exchange -> {
>              System.out.println("debug exchange");
>         })
>         .throwException(IllegalArgumentException.class, "Thomas 
> DEBUG") -> throw EXCEPTION 3 ;
>
> A route with splitter and an aggregation route.
> Before the last "to" at the end I add a process with println to set a 
> breakpoint and debug the exchange.
>
> What happens is, when an exception is thrown in the splitter route, e.g. 
> instead of the debug println.
> (EXCEPTION 1 and 2) the deadletter route works.
> But when an exception is thrown after aggregation the infos are gone.
> I noticed that the exchange at the end, before .to(EP_AGGREGATION) is 
> different from the exchange the
> ThomasAggregationStrategy:: aggregate() sees. I see unitOfWork is gone.
>
> errorHandler(deadLetterChannel("direct:deadletter").useOriginalMessage());
>     from("direct:deadletter")
>         // save original message
>
>
>


--
Claus Ibsen
-----------------
http://davsclaus.com @davsclaus
Camel in Action 2: https://www.manning.com/ibsen2

Reply via email to