On Tue, Sep 14, 2010 at 2:29 PM, Bengt Rodehav <be...@rodehav.com> wrote: > Yeah I remember reading about the problems with losing message headers > somewhere on this list... > > To be perfectly honest I think that the number of mails on this thread > indicates the importance of documenting these rules and how things work. > Claus, you are most definitely the man to do it. I've got your book (haven't > read the last updates though) and it certainly warrants a place there. > Perhaps it should also be on the wiki somewhere. >
We have added information about this in Camel in action, chapter 3 when we drill down and work the Processor which exposes the Exchange API. > /Bengt > > 2010/9/14 Claus Ibsen <claus.ib...@gmail.com> > >> On Tue, Sep 14, 2010 at 2:16 PM, Bengt Rodehav <be...@rodehav.com> wrote: >> > I think that was very useful information. I hadn't thought of a Processor >> as >> > very low level - it's definitely a level that a lot of us will use. Then >> I >> > guess that in some circumstances (like when coding a custom processor) >> you >> > need to set the out messsage if the MEP is "out capable" otherwise you >> just >> > set the in message. Are there more situations where this is needed? >> > >> >> If the MEP is out capable you can still just change the IN message. >> If the OUT is null, then Camel will re-use the IN (which you just >> changed) and thus still route whatever you have changed. >> >> You only need to use OUT if you want to create a totally 100% new >> message which is not related to the IN message at all. >> And this is only needed in special cases. >> >> Otherwise you get the problem with: Why do I lose my message headers etc. >> >> >> >> > I think that this subject is definitely complicated enough to warrant a >> good >> > documentation somewhere. I think it's really important for developers to >> > understand core concepts instead of just using boilerplate samples >> (although >> > they are very useful). >> > >> > /Bengt >> > >> > 2010/9/14 Claus Ibsen <claus.ib...@gmail.com> >> > >> >> On Tue, Sep 14, 2010 at 10:23 AM, Christian Müller >> >> <christian.muel...@gmail.com> wrote: >> >> > Hello Claus! >> >> > >> >> > That's not (in my opinion) how it works currently. At present I work >> on a >> >> > route which looks like this: >> >> > >> >> > errorHandler( >> >> > defaultErrorHandler() >> >> > .retryAttemptedLogLevel(LoggingLevel.DEBUG) >> >> > .retriesExhaustedLogLevel(LoggingLevel.INFO)); >> >> > >> >> > onException(IllegalArgumentException.class) >> >> > .handled(true) >> >> > .maximumRedeliveries(0) >> >> > .beanRef("myResultProvider", "failureResponse"); >> >> > >> >> > from("cxf:bean:MyCoolService") >> >> > .processRef("myValidator") // validates conditional rules >> >> > .inOut("direct:mySubroute") >> >> > .beanRef("myResultProvider", "successResponse") >> >> > >> >> > >> >> > If my validator throws a IllegalArgumentException and the result >> provider >> >> > writes the response into the in message, the web service will return >> >> null. >> >> > But if I write the response into the out message, the web service will >> >> > return it. So, I changes my bean to the following "pattern": >> >> > >> >> >> >> Well that could CXF Bean component having a bug. >> >> >> >> If you decide to use a Processor and work on Exchange then you use the >> >> low level Camel API and then you have to handle the IN/OUT stuff >> >> yourself. >> >> >> >> >> >> >> >> >> >> > if (exchange.getPattern().isOutCapable()) { >> >> > exchange.getOut().setBody(response); >> >> > } else { >> >> > exchange.getIn().setBody(response); >> >> > } >> >> > >> >> > And that's the same how the >> >> org.apache.camel.processor.ConvertBodyProcessor >> >> > works (I know you know this, but for the other guys.. :o) ) >> >> > >> >> > public class ConvertBodyProcessor implements Processor { >> >> > ... >> >> > public void process(Exchange exchange) throws Exception { >> >> > Message in = exchange.getIn(); >> >> > if (charset != null) { >> >> > exchange.setProperty(Exchange.CHARSET_NAME, charset); >> >> > } >> >> > Object value = in.getMandatoryBody(type); >> >> > >> >> > if (exchange.getPattern().isOutCapable()) { >> >> > Message out = exchange.getOut(); >> >> > out.copyFrom(in); >> >> > out.setBody(value); >> >> > } else { >> >> > in.setBody(value); >> >> > } >> >> > } >> >> > ... >> >> > } >> >> > >> >> > Should our custom processors/beans/.. not work in the same way? >> >> > >> >> > Cheers, >> >> > Christian >> >> > >> >> >> >> >> >> >> >> -- >> >> Claus Ibsen >> >> Apache Camel Committer >> >> >> >> Author of Camel in Action: http://www.manning.com/ibsen/ >> >> Open Source Integration: http://fusesource.com >> >> Blog: http://davsclaus.blogspot.com/ >> >> Twitter: http://twitter.com/davsclaus >> >> >> > >> >> >> >> -- >> Claus Ibsen >> Apache Camel Committer >> >> Author of Camel in Action: http://www.manning.com/ibsen/ >> Open Source Integration: http://fusesource.com >> Blog: http://davsclaus.blogspot.com/ >> Twitter: http://twitter.com/davsclaus >> > -- Claus Ibsen Apache Camel Committer Author of Camel in Action: http://www.manning.com/ibsen/ Open Source Integration: http://fusesource.com Blog: http://davsclaus.blogspot.com/ Twitter: http://twitter.com/davsclaus