This is a bad news for me.

Processor is very useful for customized message transformer, but now it
seems the processor cannot provide MEP-independent feature. I must deal with
all the MEP of camel correctly in the Processor if I want to re-use the
processor in different MEP. 

Camel provide POJO Bean which provide MEP-independent feature. But it's not
very facility to customize message transformer at Message-Level.

So, does the camel provide a processor which can work at Message-Level, and
provide MEP-independent feature?

Maybe it would looks like:

Interface MessageProcessor{
        Message process(Message msg);
}



Willem Jiang wrote:
>Hi,

>I think you processor should check the MEP for the exchange.
>As it broke the rule of MEP.
>Can you change the code like this, and run the test again?

>Class IncreaseProcessor{
>       void process(Exchange me)
>       {
>               Integer result= me.getIn().getBody() + 1;
>                 if (me.getPattern().isOutCapable()) {
>                       me.getOut().setBody(result);
>                 } else {
>                       me.getIn().setBody(result);
>                 }
>       }
>  }
>
ext2 wrote:
> 
> Yes you are right. 
> But the real confusing thing is: the two routes I tested have same
semantic
> means, but the result is different.
> 
> While I am try to find which caused the difference, I checked the source
> code of camel, and find a lot of camel-processor obey the following rule(
I
> thinks it's camel's default rule for MEP), but the pipe-line processor
> violate it (not same as the other processors): 
> The rule is :
> 1)Processor will remember the input message-exchange
> 2)while the processor get the final result message-exchange, it will
combine
> the result message-exchange with the remembered input message-exchange. At
> this time, MEP will affect how to combine the two message-exchange
> 3) the combined result will act as the final result of processor;
> 
> But the pipe-line processor doesn't remember the input message-exchange,
but
> remember the result of first processor in the pipe-line as the
> message-exchange to combine; So it cause the two routes has different
> result;
> 
> 
> Willem Jiang wrote:
>> Your processor should check the MEP, and don't set the out message if 
>> the Exchange's MEP is InOnly.
> 
>> If there is a out message, the pipeline will try to copy the out message 
>> to next processor exchange's in message, otherwise it will copy the in 
>> message to next processor exchange's in message.
> 
>> Willem
> 
> ext2 wrote:
>> Hi:
>> The camel 2.1's pipeline patter's MEP is InOnly default. But the result
of
>> following route is different, if I using inOnly() processor in route vs
>> using default;
>>
>> I tried it using a simple sample: send a message to a direct endpoint,
> which
>> body is number=1, a route receive the message and increase the message's
>> body twice by a processor, then send to a mock endpoint;
>>
>> The increase number process's code is:
>>
>> Class IncreaseProcessor{
>>      void process(MessageExchange me)
>>      {
>>              Integer result= Me.getIn().getBody() + 1;
>>              Me.getOut().setBody(result);
>>      }
>> }
>>
>> 1): following rout using inOnly() processor , and mock endpoint's return
>> ME's in.body=3, out=Null
>>
>>
>
from("direct:inOnlyUsingProcessor").inOnly().process(outProcessor).process(o
>> utProcessor).to("mock:result");
>>
>>
>> 2) following route using default inOnly, and mock's return ME's
in.body=3,
>> out.body=2. 
>>
>
from("direct:inOnlyDefault").process(outProcessor).process(outProcessor).to(
>> "mock:result");
>>
>> So why the result has a out message and it's body=2, it should be same as
>> the first route(out=null);
>>
>>
>>
>>
>>
>>
> 
> 
> 
> 



Reply via email to