You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by "lauri.siltanen" <la...@gmail.com> on 2009/08/05 09:27:52 UTC

Route definition with aggregation

I have a bunch of messages that need to be routed from EndpointA to
EndpointB, always. In addition, sometimes these messages need to be
aggregated to EndpointC. So always to B, sometimes to C.

I have tries to achieve this by the following DSL definition:

from(EndpointA).choice()
  .when(aggregationPredicate)
    .aggregate(myAggregationCollection).to(EndpointC)
  .when(endpointBPredicate)
    .to(EndpointB)
  .otherwise()
    .to(deadLetters);

This does not work due to the fact that to(EndpointC) is of type
AggregationDefinition instead of ChoiceDefinition and therefore cannot be
followed by .when(endpointBPredicate).



The other definition I tried was the following:

from(EndpointA).choice()
  .when(aggregationPredicate)
    .aggregate(myAggregationCollection).to(EndpointC);

from(EndpointA).choice()
  .when(endpointBPredicate)
    .to(EndpointB)
  .otherwise()
    .to(deadLetters);

What happens here is that every other time the messages go to the first
from(EndpointA).choice() and every other time they go to the second
from(EndpointA).choice(). I would like them to go to both.

How do I go about getting the messages to both endpoints when the predicates
return true?

Thanks,
Lauri
-- 
View this message in context: http://www.nabble.com/Route-definition-with-aggregation-tp24822021p24822021.html
Sent from the Camel - Users mailing list archive at Nabble.com.


Re: Route definition with aggregation

Posted by Claus Ibsen <cl...@gmail.com>.
On Wed, Aug 5, 2009 at 12:04 PM, lauri.siltanen<la...@gmail.com> wrote:
>
> Hi, Claus
>
> Yes, unfortunately, aggregation is required for handling the messages. But I
> was able to make it work using the .end() approach. Since that may look
> confusing to everyone else, I'll give the direct enpoint a go.
>
> I did actually have a "dummy" endpoint in use, much like the direct endpoint
> you're suggesting, but it was my own endpoint and it seemed a bit clumsy. I
> wasn't aware of the direct endpoint at the time. It looks a lot less like a
> kludge :)
>
> Thanks a lot for the quick answer!
Glad you got it working.

Yeah I like to divide my routes into smaller pieces and like them using direct.
Then its also easier to test the different routes individually and
later the "big picture".

I guess if we had an alias for direct, like "link" or "link-route" or
something then it would be more obvious to use it?




>
> Lauri
>
>
>
> Claus Ibsen-2 wrote:
>>
>> Hi
>>
>> Are you sure you want to use an aggregator?
>> When reading it is sounds like you want to do
>>
>> from A -> B -> choice when (X) -> C
>>
>> from(EndpointA)
>>  .to(EndpointB)
>>  .choice()
>>     .when(aggregationPredicate).to(EndpointC)
>>   .end();
>>
>>
>> You can use the "direct" endpoint to link routes together so if you
>> have trouble with having aggregator nested
>> then just route to a "direct:foo" endpoint and then do a
>>
>> from("direct:foo").aggreagate...
>>
>> You can also try adding a .end() in your route to help Camel denote
>> the end of the when / choice / aggregate blocks.
>>
>>
>> On Wed, Aug 5, 2009 at 9:27 AM, lauri.siltanen<la...@gmail.com>
>> wrote:
>>>
>>> I have a bunch of messages that need to be routed from EndpointA to
>>> EndpointB, always. In addition, sometimes these messages need to be
>>> aggregated to EndpointC. So always to B, sometimes to C.
>>>
>>> I have tries to achieve this by the following DSL definition:
>>>
>>> from(EndpointA).choice()
>>>  .when(aggregationPredicate)
>>>    .aggregate(myAggregationCollection).to(EndpointC)
>>>  .when(endpointBPredicate)
>>>    .to(EndpointB)
>>>  .otherwise()
>>>    .to(deadLetters);
>>>
>>> This does not work due to the fact that to(EndpointC) is of type
>>> AggregationDefinition instead of ChoiceDefinition and therefore cannot be
>>> followed by .when(endpointBPredicate).
>>>
>>>
>>>
>>> The other definition I tried was the following:
>>>
>>> from(EndpointA).choice()
>>>  .when(aggregationPredicate)
>>>    .aggregate(myAggregationCollection).to(EndpointC);
>>>
>>> from(EndpointA).choice()
>>>  .when(endpointBPredicate)
>>>    .to(EndpointB)
>>>  .otherwise()
>>>    .to(deadLetters);
>>>
>>> What happens here is that every other time the messages go to the first
>>> from(EndpointA).choice() and every other time they go to the second
>>> from(EndpointA).choice(). I would like them to go to both.
>>>
>>> How do I go about getting the messages to both endpoints when the
>>> predicates
>>> return true?
>>>
>>> Thanks,
>>> Lauri
>>> --
>>> View this message in context:
>>> http://www.nabble.com/Route-definition-with-aggregation-tp24822021p24822021.html
>>> Sent from the Camel - Users mailing list archive at Nabble.com.
>>>
>>>
>>
>>
>>
>> --
>> Claus Ibsen
>> Apache Camel Committer
>>
>> Open Source Integration: http://fusesource.com
>> Blog: http://davsclaus.blogspot.com/
>> Twitter: http://twitter.com/davsclaus
>>
>>
>
> --
> View this message in context: http://www.nabble.com/Route-definition-with-aggregation-tp24822021p24824055.html
> Sent from the Camel - Users mailing list archive at Nabble.com.
>
>



-- 
Claus Ibsen
Apache Camel Committer

Open Source Integration: http://fusesource.com
Blog: http://davsclaus.blogspot.com/
Twitter: http://twitter.com/davsclaus

Re: Route definition with aggregation

Posted by "lauri.siltanen" <la...@gmail.com>.
Hi, Claus

Yes, unfortunately, aggregation is required for handling the messages. But I
was able to make it work using the .end() approach. Since that may look
confusing to everyone else, I'll give the direct enpoint a go.

I did actually have a "dummy" endpoint in use, much like the direct endpoint
you're suggesting, but it was my own endpoint and it seemed a bit clumsy. I
wasn't aware of the direct endpoint at the time. It looks a lot less like a
kludge :)

Thanks a lot for the quick answer!

Lauri



Claus Ibsen-2 wrote:
> 
> Hi
> 
> Are you sure you want to use an aggregator?
> When reading it is sounds like you want to do
> 
> from A -> B -> choice when (X) -> C
> 
> from(EndpointA)
>  .to(EndpointB)
>  .choice()
>     .when(aggregationPredicate).to(EndpointC)
>   .end();
> 
> 
> You can use the "direct" endpoint to link routes together so if you
> have trouble with having aggregator nested
> then just route to a "direct:foo" endpoint and then do a
> 
> from("direct:foo").aggreagate...
> 
> You can also try adding a .end() in your route to help Camel denote
> the end of the when / choice / aggregate blocks.
> 
> 
> On Wed, Aug 5, 2009 at 9:27 AM, lauri.siltanen<la...@gmail.com>
> wrote:
>>
>> I have a bunch of messages that need to be routed from EndpointA to
>> EndpointB, always. In addition, sometimes these messages need to be
>> aggregated to EndpointC. So always to B, sometimes to C.
>>
>> I have tries to achieve this by the following DSL definition:
>>
>> from(EndpointA).choice()
>>  .when(aggregationPredicate)
>>    .aggregate(myAggregationCollection).to(EndpointC)
>>  .when(endpointBPredicate)
>>    .to(EndpointB)
>>  .otherwise()
>>    .to(deadLetters);
>>
>> This does not work due to the fact that to(EndpointC) is of type
>> AggregationDefinition instead of ChoiceDefinition and therefore cannot be
>> followed by .when(endpointBPredicate).
>>
>>
>>
>> The other definition I tried was the following:
>>
>> from(EndpointA).choice()
>>  .when(aggregationPredicate)
>>    .aggregate(myAggregationCollection).to(EndpointC);
>>
>> from(EndpointA).choice()
>>  .when(endpointBPredicate)
>>    .to(EndpointB)
>>  .otherwise()
>>    .to(deadLetters);
>>
>> What happens here is that every other time the messages go to the first
>> from(EndpointA).choice() and every other time they go to the second
>> from(EndpointA).choice(). I would like them to go to both.
>>
>> How do I go about getting the messages to both endpoints when the
>> predicates
>> return true?
>>
>> Thanks,
>> Lauri
>> --
>> View this message in context:
>> http://www.nabble.com/Route-definition-with-aggregation-tp24822021p24822021.html
>> Sent from the Camel - Users mailing list archive at Nabble.com.
>>
>>
> 
> 
> 
> -- 
> Claus Ibsen
> Apache Camel Committer
> 
> Open Source Integration: http://fusesource.com
> Blog: http://davsclaus.blogspot.com/
> Twitter: http://twitter.com/davsclaus
> 
> 

-- 
View this message in context: http://www.nabble.com/Route-definition-with-aggregation-tp24822021p24824055.html
Sent from the Camel - Users mailing list archive at Nabble.com.


Re: Route definition with aggregation

Posted by Claus Ibsen <cl...@gmail.com>.
Hi

Are you sure you want to use an aggregator?
When reading it is sounds like you want to do

from A -> B -> choice when (X) -> C

from(EndpointA)
 .to(EndpointB)
 .choice()
    .when(aggregationPredicate).to(EndpointC)
  .end();


You can use the "direct" endpoint to link routes together so if you
have trouble with having aggregator nested
then just route to a "direct:foo" endpoint and then do a

from("direct:foo").aggreagate...

You can also try adding a .end() in your route to help Camel denote
the end of the when / choice / aggregate blocks.


On Wed, Aug 5, 2009 at 9:27 AM, lauri.siltanen<la...@gmail.com> wrote:
>
> I have a bunch of messages that need to be routed from EndpointA to
> EndpointB, always. In addition, sometimes these messages need to be
> aggregated to EndpointC. So always to B, sometimes to C.
>
> I have tries to achieve this by the following DSL definition:
>
> from(EndpointA).choice()
>  .when(aggregationPredicate)
>    .aggregate(myAggregationCollection).to(EndpointC)
>  .when(endpointBPredicate)
>    .to(EndpointB)
>  .otherwise()
>    .to(deadLetters);
>
> This does not work due to the fact that to(EndpointC) is of type
> AggregationDefinition instead of ChoiceDefinition and therefore cannot be
> followed by .when(endpointBPredicate).
>
>
>
> The other definition I tried was the following:
>
> from(EndpointA).choice()
>  .when(aggregationPredicate)
>    .aggregate(myAggregationCollection).to(EndpointC);
>
> from(EndpointA).choice()
>  .when(endpointBPredicate)
>    .to(EndpointB)
>  .otherwise()
>    .to(deadLetters);
>
> What happens here is that every other time the messages go to the first
> from(EndpointA).choice() and every other time they go to the second
> from(EndpointA).choice(). I would like them to go to both.
>
> How do I go about getting the messages to both endpoints when the predicates
> return true?
>
> Thanks,
> Lauri
> --
> View this message in context: http://www.nabble.com/Route-definition-with-aggregation-tp24822021p24822021.html
> Sent from the Camel - Users mailing list archive at Nabble.com.
>
>



-- 
Claus Ibsen
Apache Camel Committer

Open Source Integration: http://fusesource.com
Blog: http://davsclaus.blogspot.com/
Twitter: http://twitter.com/davsclaus