Thanks Willem and Claus,

I guess we should only bother with in messages then and forget about the out
message if we want a simple rule.

I thought that the rationale for having both in- and out messages was that
the original in message would be kept unaltered while the out message would
gradually be transformed when passing through the pipeline. I assume now
that you only have access to the message as it was transformed by the
previous processor in the chain. The original message is not available - or
is it?

/Bengt

2010/9/14 Willem Jiang <willem.ji...@gmail.com>

> On 9/11/10 10:03 PM, Christian Müller wrote:
>
>> Hello list!
>>
>> I read Claus, Jonathan and Hadrians book Camel in Action and I studied the
>> Camel site [1]. I also hat a short conversation with Ade from Progress
>> about
>> the exchange pattern, but still I have the feeling I doesn't understand
>> all
>> aspects. May be you can help me to understand it correct. Here are my
>> questions:
>> - In the book and the Camel site only the exchange patterns InOut and
>> InOnly
>> are mentioned but org.apache.camel.ExchangePattern defines the following
>> exchange patterns: InOnly, RobustInOnly, InOut, InOptionalOut, OutOnly,
>> RobustOutOnly, OutIn, OutOptionalIn. Should we only use InOut and InOnly?
>> - If I understood Ade correct, after each processing on a
>> component/processor the message goes throught the pipieline before it
>> receives the next component/processor. In the case of an InOut exchange,
>> the
>> pipeline will copy the out message body, headers and attachments into the
>> in
>> message. So that in the next component/processor can access these data
>> from
>> the in message again. If I use the InOnly exchange pattern, the
>> component/processor will write the response into the in message and the
>> pipeline has nothing to copy.
>>
> The pipeline always uses a new copy of exchange which will create a new
> inMessage copy as you described, if you are using InOnly exchange pattern,
>  pipeline still create a new Exchange and copy the in message from the first
> exchange.
>
> The InOnly and InOut exchange patterns always take effect in the component
> side, current DefaultExchange will not check the exchange pattern and will
> create a new out message which copy from the exchange in message when you
> call the Exchange.getOutMessage().
>
>
>
> > From the end user perspective it looks like it
>
>> doesn't matter, whether to use the InOnly or InOut exchange pattern.
>> - The only one component I know which handle InOnly and InOut "really"
>> defferently is the jms-component. It will only send a reply message if the
>> exchange pattern InOut is used.
>> - If I use a InOnly exchange for the following routes, I takes also more
>> than 5 seconds until my templeate.send() method returns. I would expect
>> that
>> the call returns after the exchange was placed into the next sub route
>> (after a few milliseconds). My key point here is not to improve the
>> performance. Only to understand the exchange pattern correct, how the work
>> and how they are used in the right way...
>>
>>                 from("direct:start")
>>
>>                 .to("direct:sub");
>>
>>
>>
>>                 from("direct:sub")
>>
>>                 .process(*new* Processor() {
>>
>>                              @Override
>>
>>                              *public* *void* process(Exchange exchange) *
>> throws* Exception {
>>
>>                                    Thread.*sleep*(5000);
>>
>>                              }
>>
>>                         })
>>                 .to("mock:result");
>>
>>
>> - Do you have recommendations when to use InOnly and InOut?
>>
> There are some description about InOnly and InOut message echange pattern
> in the Camel in Action chapter 10, as the sync and async invocation. You may
> take a look.
>
>
>  - If we write our own processor which modifies the in message, should they
>> write the modified body into the out message, if the exchnage is out
>> capable
>> (and also copy all header and attachments we need for further processing)?
>> Or should we always modify the in message because it requires less action?
>>
> You can modify the in message directly, or do some change on the out
> message and the pipeline will pick up the right modified message for you.
> The DefaultExchange will create a new out message based on the in message if
> you call the Exchange.getOutMessage(), so you don't need to copy the all the
> headers and attachments yourself.
>
>
>  - The same question for our own type converters. I know the type converter
>> is implemented in this way, that it will return the new (converted)
>> object.
>> But our type converters also have to modify the message header. Should
>> they
>> also check whether the exchange is out capable and than modify the out (if
>> out capable) or in (if not out capable) message? Is this the way camel
>> handels the converted object from the type converter?
>>
>
> I think you just need to make the change on the in message, if you want to
> avoid the addition copying (camel will copy the out message from the in
> message if you make the change on the out message of the exchange).
>
>
>> [1] http://camel.apache.org/exchange-pattern.html
>>
>> Thanks in advance for your help and taking time for my questions,
>> Christian
>>
>>
> Willem
>

Reply via email to