Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

...

Message exchange patterns and the Exchange object

The Camel API is influenced by APIs such as JBI specification, CXF which defines a concept called Message Exchange Patterns (MEP for short).

...

Flow of an exchange through a route

Image RemovedImage Added

  • The out message from each step is used as the in message for the next step
  • if there is no out message then the in message is used instead
  • For the InOut MEP the out from the last step in the route is returned to the producer. In case of InOnly the last out is thrown away
Tip
titleBeware of getOut to check if there is an out message

exchange.getOut creates an out message if there is none. So if you want to check if there is an out message then you should use exchange.hasOut instead

...

Now suppose you want to use a Camel Processor to adjust a message. This can be done as follows:

Code Block
java
java

public void process(Exchange exchange) throws Exception {
   String body = exchange.getIn().getBody(String.class);
   // change the message to say Hello
   exchange.getOut().setBody("Hello " + body);
}

This seems intuitive and is what you would expect is the right approach to change a message from a Processor.
However there is an big issue - the getOut method will create a new Message, which means any other information
from the IN message will not be propagated; which means you will lose that data.
To remedy this we'll have to copy the data which is done as follows:

Code Block
java
java

public void process(Exchange exchange) throws Exception {
   String body = exchange.getIn().getBody(String.class);
   // change the message to say Hello
   exchange.getOut().setBody("Hello " + body);
   // copy headers from IN to OUT to propagate them
   exchange.getOut().setHeaders(exchange.getIn().getHeaders());
}

Well that is not all, a Message can also contain attachments so to be sure you need to propagate those as well:

Code Block
java
java

public void process(Exchange exchange) throws Exception {
   String body = exchange.getIn().getBody(String.class);
   // change the message to say Hello
   exchange.getOut().setBody("Hello " + body);
   // copy headers from IN to OUT to propagate them
   exchange.getOut().setHeaders(exchange.getIn().getHeaders();
   // copy attachements from IN to OUT to propagate them
   exchange.getOut().setAttachments(exchange.getIn().getAttachments());
}

Now we ensure that all additional data is propagated on the new OUT message. But its a shame we need 2 code lines to ensure data is propagated.
What you can do instead is to change the IN message instead, as shown below:

Code Block
java
java

public void process(Exchange exchange) throws Exception {
   String body = exchange.getIn().getBody(String.class);
   // change the existing message to say Hello
   exchange.getIn().setBody("Hello " + body);
}

...