Sorry, this maybe better - using setMsgId()
<pre>
@Test
public void request01Test() throws Exception {
    final PDUBean bean1 = new PDUBean();
    bean1.setMsgId("1");

    final PDUBean bean2 = new PDUBean();
    bean2.setMsgId("2");

    PDUBean rslt1 = template.requestBody(bean1, PDUBean.class);
    PDUBean rslt2 = template.requestBody(bean2, PDUBean.class);
    assertEquals("Found 1 0", rslt1.getErrMsg());
    assertEquals("Found 2 1", rslt2.getErrMsg());
}
</pre>

On Wed, Jun 24, 2015 at 8:27 PM, Ravi Nallappan <ravi.nallap...@gmail.com>
wrote:

> Thanks Claus.
>
> Ok, I have made some changes on my design (daisy-chaining way instead).
>
> From
> ====
>
> Maven Camel Project A: from(direct://<ModuleA>).<processing>
> Maven Camel Project B: from(direct://<ModuleB>).<processing>
> Maven Camel Project C: from(direct://<ModuleC>).<processing>
>
> Maven Camel Project
> Main: 
> from(<consumer>).to(direct://<ModuleA>).to(direct://<ModuleB>).to(direct://<ModuleC>)
>
> To
> ==
>
> Maven Camel Project
> A: from(direct://<ModuleA>-in).<processing>.to(direct://<ModuleA>-out)
> Maven Camel Project
> B: from(direct://<ModuleB>-in).<processing>.to(direct://<ModuleB>-out)
> Maven Camel Project
> C: from(direct://<ModuleC>-in).<processing>.to(direct://<ModuleC>-out)
>
> Maven Camel Project Main:
> from(<consumer>).to(direct://<ModuleA>-in)
> from(direct://<ModuleA>-out).to(direct://<ModuleB>-in)
> from(direct://<ModuleB>-out).to(direct://<ModuleC>-in)
> from(direct://<ModuleC>-out).log(<non essential>)
>
> Its seems to be working fine now. (Let me know if anything there's any red
> flag).
>
> Another related question on this - Now my consumer expects response to
> send back to external system (request-reply). From my current observation,
> every message that's sent out also gets correct reply despite being
> aggregated (combined by aggregate) - i.e somehow it knows which exact
> payload need to be returned for each request (using bean as payload).
>
> Is this expected behaviour? Does the 'discarded' Exchanges
> (inside AggregationStrategy.aggregate) wait for 'retained' Exchange to go
> all the way forward in route and back before returned? And does it do
> anything to figure out how to 'split' the message again (I am taking blind
> guess here).
>
> Hope following camel test snippet clarifies what I was referring to.
> <pre>
> //...
> @Override
> protected RouteBuilder createRouteBuilder() {
> return new CombineRouteBuilder() {
>     @Override
>     public void configure() {
>         super.configure();
>         from("direct://test-combine").to("direct://combine-in");
>         from("direct://combine-out").process(new Processor(){
>             @Override
>             public void process(Exchange exchange) throws Exception {
>                 int i = 0 ;
>                 for (PDUBean b : exchange.getIn().getBody(PDUBean.class) )
> {
>                     b.setErrMsg("Found " + b.getMsgId() + " " + i++ );
>                 }
>             }
>         }).to("mock:result") ;
>     }
> };
> }
> //...
> @Test
> public void request01Test() throws Exception {
>     final PDUBean bean1 = new PDUBean();
>     bean1.setMessage("Hello, World! 1");
>
>     final PDUBean bean2 = new PDUBean();
>     bean2.setMessage("Hello, World! 2");
>
>     PDUBean rslt1 = template.requestBody(bean1, PDUBean.class);
>     PDUBean rslt2 = template.requestBody(bean2, PDUBean.class);
>     assertEquals("Found 1 0", rslt1.getErrMsg());
>     assertEquals("Found 2 1", rslt2.getErrMsg());
> }
> </pre>
>
>
> Thanks and regards,
> Ravi Nallappan
>
>
>
> On Tue, Jun 23, 2015 at 8:46 PM, Claus Ibsen <claus.ib...@gmail.com>
> wrote:
>
>> Hi
>>
>> A bit hard to explain without having to write endless long emails.
>>
>> This is expected the aggregator uses a separate "leg" of the routing
>> when it sends completed outgoing messages. eg its input and output
>> legs are separated.
>>
>>
>> On Tue, Jun 23, 2015 at 1:11 PM, Ravi Nallappan
>> <ravi.nallap...@gmail.com> wrote:
>> > Hi,
>> >
>> > I am trying to create modular routes that at the end stitched together
>> by a
>> > main route. This strategy is working for most of my other routing except
>> > when I use aggregator.
>> >
>> > I have created a simple test case for this scenario:
>> >
>> > <pre>
>> > package com.ravi.test;
>> >
>> > import org.apache.camel.Exchange;
>> > import org.apache.camel.builder.RouteBuilder;
>> > import org.apache.camel.component.mock.MockEndpoint;
>> > import org.apache.camel.processor.aggregate.AggregationStrategy;
>> > import org.apache.camel.test.junit4.CamelTestSupport;
>> > import org.junit.Test;
>> >
>> > public class AggregateRouteTest extends CamelTestSupport {
>> >   @Override
>> >   protected RouteBuilder createRouteBuilder() {
>> >     return new RouteBuilder() {
>> >       @Override
>> >       public void configure() {
>> >         // @formatter:off
>> >         from("direct://test-combine")
>> >           .to("direct://combine")
>> > //        .to("mock:result") /* 1 */
>> >         ;
>> >
>> >         from("direct://combine")
>> >           .aggregate(header("myId"), new BeanAggregationStrategy())
>> >             .completionSize(3)
>> >             .completionTimeout(3000)
>> >           .to("mock:result") /* 2 */
>> >         ;
>> >         // @formatter:on
>> >       }
>> >
>> >       class BeanAggregationStrategy implements AggregationStrategy {
>> >         @Override
>> >         public Exchange aggregate(Exchange oldExchange, Exchange
>> > newExchange) {
>> >           if (oldExchange == null) {
>> >             return newExchange;
>> >           }
>> >           String oldBody = oldExchange.getIn().getBody(String.class);
>> >           String newBody = newExchange.getIn().getBody(String.class);
>> >           String body = oldBody + newBody;
>> >           oldExchange.getIn().setBody(body);
>> >           return oldExchange;
>> >         }
>> >       }
>> >     };
>> >   }
>> >
>> >   @Test
>> >   public void simpleTest() throws Exception {
>> >     MockEndpoint mock = getMockEndpoint("mock:result");
>> >     mock.expectedBodiesReceived("ABC");
>> >     template.sendBodyAndHeader("direct://test-combine", "A", "myId", 1);
>> >     template.sendBodyAndHeader("direct://test-combine", "B", "myId", 1);
>> >     template.sendBodyAndHeader("direct://test-combine", "C", "myId",
>> 1); /*
>> > 3 */
>> >     assertMockEndpointsSatisfied();
>> >   }
>> > }
>> > </pre>
>> >
>> > This code works and test case passes. However, if I uncomment line /* 1
>> */ and
>> > comment out line /* 2 */ above, the test case fails.
>> >
>> > "direct://combine" endpoint's route contains aggregation logic, while
>> > "direct://test-combine"
>> > and "mock:result" are suppose wrapper to test the route. However, this
>> does
>> > not work and requires "mock:result" to be part of "direct://combine".
>> >
>> > Even by commenting out /* 3 */ above (i.e incomplete messages to
>> > aggregate), we can see above code will wait awhile for a last message
>> while
>> > the other modification does not even wait before failing (aggregator not
>> > kicked in at all?).
>> >
>> > Appreciate if anyone able to explain the reason. And if its still
>> possible
>> > to keep "direct://combine" modular i.e combine endpoint's route remain
>> free
>> > from before and after routes details.
>> >
>> > Thanks and regards,
>> > Ravi Nallappan
>>
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> Red Hat, Inc.
>> Email: cib...@redhat.com
>> Twitter: davsclaus
>> Blog: http://davsclaus.com
>> Author of Camel in Action: http://www.manning.com/ibsen
>> hawtio: http://hawt.io/
>> fabric8: http://fabric8.io/
>>
>
>

Reply via email to