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);
>>
>>
>>
>>
>>
>>
>
>
>
>