You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Reto Peter <re...@advanceit.ch> on 2022/11/08 08:43:21 UTC
Splitter and Aggregater onCompletion
Hi all
I am using a Splitter and an Aggregator.
All of the output are written into the final result. But at the end of the Split, I wanted to add something more.
This is where the 'onCompletion' method inside the Aggregator can be used (in my mind, cause that works for scenarios without a Splitter).
But if have the 'onCompletion' method, then the Aggregator does not finish his job (cause it probably doesn't know when to stop)
If I have no 'onCompletion' method, then the Aggregator does finish his job and the route does go on
My question is: Why I cannot use the onCompletion method on the Aggregator. Cause that Aggregator does the start work and should also do the end work of the aggregation. I have used the Aggregator in other scenarios (without the Splitter), and there it worked smoothly
Route where it does work, but I needed to call a bean after the end of the Splitter.
from("direct:anything")
.to("direct:getSomething")
.split(simple("${body}"), new EdiInterchangeAggregator()) // For each document
.to("direct:prepareSomething")
.to("direct:createSomethingMore")
.end()
.log("CamelSplitSize: ${exchangeProperty.CamelSplitSize} documents")
.bean(EDIFinalizer.class, "finalizeInterchange");
So what I want is to implement the onCompletion method on the class EdiInterchangeAggregator.
Is this really not possible?
Regards
Reto
Re: Splitter and Aggregater onCompletion
Posted by Claus Ibsen <cl...@gmail.com>.
On Tue, Nov 8, 2022 at 12:03 PM Reto Peter <re...@advanceit.ch> wrote:
> Camel 3.18.3
>
> Yes, I am talking about the onCompletion method of the AggregationStrategy.
> So when I define the Splitter, I do define the AggregationStrategy class,
> and in this class it should be possible that the method onCompletion is
> called.
> But where I can define the options to the AggregationStrategy, I mean the
> completionSize, completionInterval or completionTimeout?
>
>
Ah so these are intended for aggregate only, as the splitter only use the
aggregation strategy to merge the output of the splitter, in case you want
to transform the output.
The interval/size etc is not possible to configure as it does not make
sense, as the size is the number of messages split.
It just happens that the split EIP is reusing parts of the aggregation
strategy.
In v2 the aggregation strategy had sub interfaces for all of that, but now
in v3 with default methods on interfaces its merged into a single interface.
> -----Original Message-----
> From: Claus Ibsen <cl...@gmail.com>
> Sent: Tuesday, 8 November 2022 11:54
> To: users@camel.apache.org
> Subject: Re: Splitter and Aggregater onCompletion
>
> What camel version do you use?
>
> On Tue, Nov 8, 2022 at 11:53 AM Claus Ibsen <cl...@gmail.com> wrote:
>
> > Hi
> >
> > Ah sorry there is both an onCompletion EIP you can use in routes.
> > And then AggregationStrategy with overloaded/default methods for
> > various callbacks.
> >
> >
> >
> > On Tue, Nov 8, 2022 at 11:39 AM Reto Peter <re...@advanceit.ch>
> > wrote:
> >
> >> Hi Claus
> >>
> >> Thanks, but the Aggregator has its interface AggregationStrategy and
> >> there is the 'onCompletion' method.
> >> And this method is invoked in case of the following route:
> >>
> >> from("direct:processAndAggregate")
> >> .toD("xslt-saxon:mm/transform-
> -${header.doctype}-to-EDI-XML.xsl")
> >> .aggregate(header("doctype"), new
> >> EDIMessageToInterchangeAggregatorMM())
> >> .forceCompletionOnStop()
> >> .to("sql:INSERT something");
> >>
> >> So that means, in this route the onCompletion of the Aggregator is
> >> called cause the entire route is completed?
> >>
> >> -----Original Message-----
> >> From: Claus Ibsen <cl...@gmail.com>
> >> Sent: Tuesday, 8 November 2022 09:50
> >> To: users@camel.apache.org
> >> Subject: Re: Splitter and Aggregater onCompletion
> >>
> >> Hi
> >>
> >> onCompletion is its own EIP
> >> https://camel.apache.org/manual/oncompletion.html
> >>
> >> The onCompletion works on the incoming exchange in the route, and the
> >> aggregator is separated from that incoming exchange, as the output of
> >> the aggregator runs its own "lifecycle", in its own exchange.
> >> So it has no onCompletion.
> >>
> >> The route above you show, is that when the split end() then you are
> >> continuing the incoming exchange which has onCompletion.
> >>
> >> Its a bit difficult to explain, if you have the CiA2 book then take a
> >> look in the EIP chapter about the aggregator.
> >>
> >>
> >>
> >> On Tue, Nov 8, 2022 at 9:43 AM Reto Peter <re...@advanceit.ch>
> >> wrote:
> >>
> >> > Hi all
> >> >
> >> > I am using a Splitter and an Aggregator.
> >> > All of the output are written into the final result. But at the end
> >> > of the Split, I wanted to add something more.
> >> > This is where the 'onCompletion' method inside the Aggregator can
> >> > be used (in my mind, cause that works for scenarios without a
> Splitter).
> >> >
> >> > But if have the 'onCompletion' method, then the Aggregator does not
> >> > finish his job (cause it probably doesn't know when to stop) If I
> >> > have no 'onCompletion' method, then the Aggregator does finish his
> >> > job and the route does go on
> >> >
> >> > My question is: Why I cannot use the onCompletion method on the
> >> > Aggregator. Cause that Aggregator does the start work and should
> >> > also do the end work of the aggregation. I have used the Aggregator
> >> > in other scenarios (without the Splitter), and there it worked
> >> > smoothly
> >> >
> >> > Route where it does work, but I needed to call a bean after the end
> >> > of the Splitter.
> >> > from("direct:anything")
> >> > .to("direct:getSomething")
> >> > .split(simple("${body}"), new EdiInterchangeAggregator()) //
> >> > For each document
> >> > .to("direct:prepareSomething")
> >> > .to("direct:createSomethingMore")
> >> > .end()
> >> > .log("CamelSplitSize: ${exchangeProperty.CamelSplitSize}
> >> documents")
> >> > .bean(EDIFinalizer.class, "finalizeInterchange");
> >> >
> >> > So what I want is to implement the onCompletion method on the class
> >> > EdiInterchangeAggregator.
> >> > Is this really not possible?
> >> >
> >> > Regards
> >> > Reto
> >> >
> >>
> >>
> >> --
> >> Claus Ibsen
> >> -----------------
> >> @davsclaus
> >> Camel in Action 2: https://www.manning.com/ibsen2
> >>
> >
> >
> > --
> > Claus Ibsen
> > -----------------
> > @davsclaus
> > Camel in Action 2: https://www.manning.com/ibsen2
> >
>
>
> --
> Claus Ibsen
> -----------------
> @davsclaus
> Camel in Action 2: https://www.manning.com/ibsen2
>
--
Claus Ibsen
-----------------
@davsclaus
Camel in Action 2: https://www.manning.com/ibsen2
RE: Splitter and Aggregater onCompletion
Posted by Reto Peter <re...@advanceit.ch>.
Camel 3.18.3
Yes, I am talking about the onCompletion method of the AggregationStrategy.
So when I define the Splitter, I do define the AggregationStrategy class, and in this class it should be possible that the method onCompletion is called.
But where I can define the options to the AggregationStrategy, I mean the completionSize, completionInterval or completionTimeout?
-----Original Message-----
From: Claus Ibsen <cl...@gmail.com>
Sent: Tuesday, 8 November 2022 11:54
To: users@camel.apache.org
Subject: Re: Splitter and Aggregater onCompletion
What camel version do you use?
On Tue, Nov 8, 2022 at 11:53 AM Claus Ibsen <cl...@gmail.com> wrote:
> Hi
>
> Ah sorry there is both an onCompletion EIP you can use in routes.
> And then AggregationStrategy with overloaded/default methods for
> various callbacks.
>
>
>
> On Tue, Nov 8, 2022 at 11:39 AM Reto Peter <re...@advanceit.ch>
> wrote:
>
>> Hi Claus
>>
>> Thanks, but the Aggregator has its interface AggregationStrategy and
>> there is the 'onCompletion' method.
>> And this method is invoked in case of the following route:
>>
>> from("direct:processAndAggregate")
>> .toD("xslt-saxon:mm/transform- -${header.doctype}-to-EDI-XML.xsl")
>> .aggregate(header("doctype"), new
>> EDIMessageToInterchangeAggregatorMM())
>> .forceCompletionOnStop()
>> .to("sql:INSERT something");
>>
>> So that means, in this route the onCompletion of the Aggregator is
>> called cause the entire route is completed?
>>
>> -----Original Message-----
>> From: Claus Ibsen <cl...@gmail.com>
>> Sent: Tuesday, 8 November 2022 09:50
>> To: users@camel.apache.org
>> Subject: Re: Splitter and Aggregater onCompletion
>>
>> Hi
>>
>> onCompletion is its own EIP
>> https://camel.apache.org/manual/oncompletion.html
>>
>> The onCompletion works on the incoming exchange in the route, and the
>> aggregator is separated from that incoming exchange, as the output of
>> the aggregator runs its own "lifecycle", in its own exchange.
>> So it has no onCompletion.
>>
>> The route above you show, is that when the split end() then you are
>> continuing the incoming exchange which has onCompletion.
>>
>> Its a bit difficult to explain, if you have the CiA2 book then take a
>> look in the EIP chapter about the aggregator.
>>
>>
>>
>> On Tue, Nov 8, 2022 at 9:43 AM Reto Peter <re...@advanceit.ch>
>> wrote:
>>
>> > Hi all
>> >
>> > I am using a Splitter and an Aggregator.
>> > All of the output are written into the final result. But at the end
>> > of the Split, I wanted to add something more.
>> > This is where the 'onCompletion' method inside the Aggregator can
>> > be used (in my mind, cause that works for scenarios without a Splitter).
>> >
>> > But if have the 'onCompletion' method, then the Aggregator does not
>> > finish his job (cause it probably doesn't know when to stop) If I
>> > have no 'onCompletion' method, then the Aggregator does finish his
>> > job and the route does go on
>> >
>> > My question is: Why I cannot use the onCompletion method on the
>> > Aggregator. Cause that Aggregator does the start work and should
>> > also do the end work of the aggregation. I have used the Aggregator
>> > in other scenarios (without the Splitter), and there it worked
>> > smoothly
>> >
>> > Route where it does work, but I needed to call a bean after the end
>> > of the Splitter.
>> > from("direct:anything")
>> > .to("direct:getSomething")
>> > .split(simple("${body}"), new EdiInterchangeAggregator()) //
>> > For each document
>> > .to("direct:prepareSomething")
>> > .to("direct:createSomethingMore")
>> > .end()
>> > .log("CamelSplitSize: ${exchangeProperty.CamelSplitSize}
>> documents")
>> > .bean(EDIFinalizer.class, "finalizeInterchange");
>> >
>> > So what I want is to implement the onCompletion method on the class
>> > EdiInterchangeAggregator.
>> > Is this really not possible?
>> >
>> > Regards
>> > Reto
>> >
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> @davsclaus
>> Camel in Action 2: https://www.manning.com/ibsen2
>>
>
>
> --
> Claus Ibsen
> -----------------
> @davsclaus
> Camel in Action 2: https://www.manning.com/ibsen2
>
--
Claus Ibsen
-----------------
@davsclaus
Camel in Action 2: https://www.manning.com/ibsen2
Re: Splitter and Aggregater onCompletion
Posted by Claus Ibsen <cl...@gmail.com>.
What camel version do you use?
On Tue, Nov 8, 2022 at 11:53 AM Claus Ibsen <cl...@gmail.com> wrote:
> Hi
>
> Ah sorry there is both an onCompletion EIP you can use in routes.
> And then AggregationStrategy with overloaded/default methods for various
> callbacks.
>
>
>
> On Tue, Nov 8, 2022 at 11:39 AM Reto Peter <re...@advanceit.ch>
> wrote:
>
>> Hi Claus
>>
>> Thanks, but the Aggregator has its interface AggregationStrategy and
>> there is the 'onCompletion' method.
>> And this method is invoked in case of the following route:
>>
>> from("direct:processAndAggregate")
>> .toD("xslt-saxon:mm/transform- -${header.doctype}-to-EDI-XML.xsl")
>> .aggregate(header("doctype"), new
>> EDIMessageToInterchangeAggregatorMM())
>> .forceCompletionOnStop()
>> .to("sql:INSERT something");
>>
>> So that means, in this route the onCompletion of the Aggregator is called
>> cause the entire route is completed?
>>
>> -----Original Message-----
>> From: Claus Ibsen <cl...@gmail.com>
>> Sent: Tuesday, 8 November 2022 09:50
>> To: users@camel.apache.org
>> Subject: Re: Splitter and Aggregater onCompletion
>>
>> Hi
>>
>> onCompletion is its own EIP
>> https://camel.apache.org/manual/oncompletion.html
>>
>> The onCompletion works on the incoming exchange in the route, and the
>> aggregator is separated from that incoming exchange, as the output of the
>> aggregator runs its own "lifecycle", in its own exchange.
>> So it has no onCompletion.
>>
>> The route above you show, is that when the split end() then you are
>> continuing the incoming exchange which has onCompletion.
>>
>> Its a bit difficult to explain, if you have the CiA2 book then take a
>> look in the EIP chapter about the aggregator.
>>
>>
>>
>> On Tue, Nov 8, 2022 at 9:43 AM Reto Peter <re...@advanceit.ch>
>> wrote:
>>
>> > Hi all
>> >
>> > I am using a Splitter and an Aggregator.
>> > All of the output are written into the final result. But at the end of
>> > the Split, I wanted to add something more.
>> > This is where the 'onCompletion' method inside the Aggregator can be
>> > used (in my mind, cause that works for scenarios without a Splitter).
>> >
>> > But if have the 'onCompletion' method, then the Aggregator does not
>> > finish his job (cause it probably doesn't know when to stop) If I have
>> > no 'onCompletion' method, then the Aggregator does finish his job and
>> > the route does go on
>> >
>> > My question is: Why I cannot use the onCompletion method on the
>> > Aggregator. Cause that Aggregator does the start work and should also
>> > do the end work of the aggregation. I have used the Aggregator in
>> > other scenarios (without the Splitter), and there it worked smoothly
>> >
>> > Route where it does work, but I needed to call a bean after the end of
>> > the Splitter.
>> > from("direct:anything")
>> > .to("direct:getSomething")
>> > .split(simple("${body}"), new EdiInterchangeAggregator()) //
>> > For each document
>> > .to("direct:prepareSomething")
>> > .to("direct:createSomethingMore")
>> > .end()
>> > .log("CamelSplitSize: ${exchangeProperty.CamelSplitSize}
>> documents")
>> > .bean(EDIFinalizer.class, "finalizeInterchange");
>> >
>> > So what I want is to implement the onCompletion method on the class
>> > EdiInterchangeAggregator.
>> > Is this really not possible?
>> >
>> > Regards
>> > Reto
>> >
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> @davsclaus
>> Camel in Action 2: https://www.manning.com/ibsen2
>>
>
>
> --
> Claus Ibsen
> -----------------
> @davsclaus
> Camel in Action 2: https://www.manning.com/ibsen2
>
--
Claus Ibsen
-----------------
@davsclaus
Camel in Action 2: https://www.manning.com/ibsen2
Re: Splitter and Aggregater onCompletion
Posted by Claus Ibsen <cl...@gmail.com>.
Hi
Ah sorry there is both an onCompletion EIP you can use in routes.
And then AggregationStrategy with overloaded/default methods for various
callbacks.
On Tue, Nov 8, 2022 at 11:39 AM Reto Peter <re...@advanceit.ch> wrote:
> Hi Claus
>
> Thanks, but the Aggregator has its interface AggregationStrategy and there
> is the 'onCompletion' method.
> And this method is invoked in case of the following route:
>
> from("direct:processAndAggregate")
> .toD("xslt-saxon:mm/transform- -${header.doctype}-to-EDI-XML.xsl")
> .aggregate(header("doctype"), new
> EDIMessageToInterchangeAggregatorMM())
> .forceCompletionOnStop()
> .to("sql:INSERT something");
>
> So that means, in this route the onCompletion of the Aggregator is called
> cause the entire route is completed?
>
> -----Original Message-----
> From: Claus Ibsen <cl...@gmail.com>
> Sent: Tuesday, 8 November 2022 09:50
> To: users@camel.apache.org
> Subject: Re: Splitter and Aggregater onCompletion
>
> Hi
>
> onCompletion is its own EIP
> https://camel.apache.org/manual/oncompletion.html
>
> The onCompletion works on the incoming exchange in the route, and the
> aggregator is separated from that incoming exchange, as the output of the
> aggregator runs its own "lifecycle", in its own exchange.
> So it has no onCompletion.
>
> The route above you show, is that when the split end() then you are
> continuing the incoming exchange which has onCompletion.
>
> Its a bit difficult to explain, if you have the CiA2 book then take a look
> in the EIP chapter about the aggregator.
>
>
>
> On Tue, Nov 8, 2022 at 9:43 AM Reto Peter <re...@advanceit.ch> wrote:
>
> > Hi all
> >
> > I am using a Splitter and an Aggregator.
> > All of the output are written into the final result. But at the end of
> > the Split, I wanted to add something more.
> > This is where the 'onCompletion' method inside the Aggregator can be
> > used (in my mind, cause that works for scenarios without a Splitter).
> >
> > But if have the 'onCompletion' method, then the Aggregator does not
> > finish his job (cause it probably doesn't know when to stop) If I have
> > no 'onCompletion' method, then the Aggregator does finish his job and
> > the route does go on
> >
> > My question is: Why I cannot use the onCompletion method on the
> > Aggregator. Cause that Aggregator does the start work and should also
> > do the end work of the aggregation. I have used the Aggregator in
> > other scenarios (without the Splitter), and there it worked smoothly
> >
> > Route where it does work, but I needed to call a bean after the end of
> > the Splitter.
> > from("direct:anything")
> > .to("direct:getSomething")
> > .split(simple("${body}"), new EdiInterchangeAggregator()) //
> > For each document
> > .to("direct:prepareSomething")
> > .to("direct:createSomethingMore")
> > .end()
> > .log("CamelSplitSize: ${exchangeProperty.CamelSplitSize}
> documents")
> > .bean(EDIFinalizer.class, "finalizeInterchange");
> >
> > So what I want is to implement the onCompletion method on the class
> > EdiInterchangeAggregator.
> > Is this really not possible?
> >
> > Regards
> > Reto
> >
>
>
> --
> Claus Ibsen
> -----------------
> @davsclaus
> Camel in Action 2: https://www.manning.com/ibsen2
>
--
Claus Ibsen
-----------------
@davsclaus
Camel in Action 2: https://www.manning.com/ibsen2
RE: Splitter and Aggregater onCompletion
Posted by Reto Peter <re...@advanceit.ch>.
Hi Claus
Thanks, but the Aggregator has its interface AggregationStrategy and there is the 'onCompletion' method.
And this method is invoked in case of the following route:
from("direct:processAndAggregate")
.toD("xslt-saxon:mm/transform- -${header.doctype}-to-EDI-XML.xsl")
.aggregate(header("doctype"), new EDIMessageToInterchangeAggregatorMM())
.forceCompletionOnStop()
.to("sql:INSERT something");
So that means, in this route the onCompletion of the Aggregator is called cause the entire route is completed?
-----Original Message-----
From: Claus Ibsen <cl...@gmail.com>
Sent: Tuesday, 8 November 2022 09:50
To: users@camel.apache.org
Subject: Re: Splitter and Aggregater onCompletion
Hi
onCompletion is its own EIP
https://camel.apache.org/manual/oncompletion.html
The onCompletion works on the incoming exchange in the route, and the aggregator is separated from that incoming exchange, as the output of the aggregator runs its own "lifecycle", in its own exchange.
So it has no onCompletion.
The route above you show, is that when the split end() then you are continuing the incoming exchange which has onCompletion.
Its a bit difficult to explain, if you have the CiA2 book then take a look in the EIP chapter about the aggregator.
On Tue, Nov 8, 2022 at 9:43 AM Reto Peter <re...@advanceit.ch> wrote:
> Hi all
>
> I am using a Splitter and an Aggregator.
> All of the output are written into the final result. But at the end of
> the Split, I wanted to add something more.
> This is where the 'onCompletion' method inside the Aggregator can be
> used (in my mind, cause that works for scenarios without a Splitter).
>
> But if have the 'onCompletion' method, then the Aggregator does not
> finish his job (cause it probably doesn't know when to stop) If I have
> no 'onCompletion' method, then the Aggregator does finish his job and
> the route does go on
>
> My question is: Why I cannot use the onCompletion method on the
> Aggregator. Cause that Aggregator does the start work and should also
> do the end work of the aggregation. I have used the Aggregator in
> other scenarios (without the Splitter), and there it worked smoothly
>
> Route where it does work, but I needed to call a bean after the end of
> the Splitter.
> from("direct:anything")
> .to("direct:getSomething")
> .split(simple("${body}"), new EdiInterchangeAggregator()) //
> For each document
> .to("direct:prepareSomething")
> .to("direct:createSomethingMore")
> .end()
> .log("CamelSplitSize: ${exchangeProperty.CamelSplitSize} documents")
> .bean(EDIFinalizer.class, "finalizeInterchange");
>
> So what I want is to implement the onCompletion method on the class
> EdiInterchangeAggregator.
> Is this really not possible?
>
> Regards
> Reto
>
--
Claus Ibsen
-----------------
@davsclaus
Camel in Action 2: https://www.manning.com/ibsen2
Re: Splitter and Aggregater onCompletion
Posted by Claus Ibsen <cl...@gmail.com>.
Hi
onCompletion is its own EIP
https://camel.apache.org/manual/oncompletion.html
The onCompletion works on the incoming exchange in the route, and the
aggregator is separated from that incoming exchange, as the output of the
aggregator runs its own "lifecycle", in its own exchange.
So it has no onCompletion.
The route above you show, is that when the split end() then you are
continuing the incoming exchange which has onCompletion.
Its a bit difficult to explain, if you have the CiA2 book then take a look
in the EIP chapter about the aggregator.
On Tue, Nov 8, 2022 at 9:43 AM Reto Peter <re...@advanceit.ch> wrote:
> Hi all
>
> I am using a Splitter and an Aggregator.
> All of the output are written into the final result. But at the end of the
> Split, I wanted to add something more.
> This is where the 'onCompletion' method inside the Aggregator can be used
> (in my mind, cause that works for scenarios without a Splitter).
>
> But if have the 'onCompletion' method, then the Aggregator does not finish
> his job (cause it probably doesn't know when to stop)
> If I have no 'onCompletion' method, then the Aggregator does finish his
> job and the route does go on
>
> My question is: Why I cannot use the onCompletion method on the
> Aggregator. Cause that Aggregator does the start work and should also do
> the end work of the aggregation. I have used the Aggregator in other
> scenarios (without the Splitter), and there it worked smoothly
>
> Route where it does work, but I needed to call a bean after the end of the
> Splitter.
> from("direct:anything")
> .to("direct:getSomething")
> .split(simple("${body}"), new EdiInterchangeAggregator()) // For
> each document
> .to("direct:prepareSomething")
> .to("direct:createSomethingMore")
> .end()
> .log("CamelSplitSize: ${exchangeProperty.CamelSplitSize} documents")
> .bean(EDIFinalizer.class, "finalizeInterchange");
>
> So what I want is to implement the onCompletion method on the class
> EdiInterchangeAggregator.
> Is this really not possible?
>
> Regards
> Reto
>
--
Claus Ibsen
-----------------
@davsclaus
Camel in Action 2: https://www.manning.com/ibsen2