On Fri, Jul 15, 2011 at 1:41 PM, alberto.zigoni <alberto.zig...@gmail.com> wrote: > I am trying to properly configure error handler with onException on this > route: > > <route id="cashReservationsRoute" handleFault="true"> > <from uri="direct:startCashReservationsRoute" /> > > <onException> > <exception>org.apache.cxf.interceptor.Fault</exception> > <continued><constant>true</constant></continued> > <log message="getCashReservations() error ignored" /> > <!-- <process ref="errorHandlerProcessor" /> --> > </onException> > > <!-- Prepare GetReservationsCashReportReq --> > <process ref="prepareCashReservationsRequestProcessor" /> > <!-- Add server token to request --> > <enrich uri="direct:getServerToken" > strategyRef="setTokenToGenericRequestStrategy" /> > <to uri="cxf:bean:dgwEndpoint" /> > <log message="Retrieved cash reservations" /> > </route> > > This route is invoked by an enrich EIP in the following route: > > <route id="terminalsConfiguration"> > <from uri="direct:startTerminalsConfiguration" /> > ... > ... > <split> > <simple>${body}</simple> > <log message="Processing terminal with IP address: > ${body.ipAddress}" /> > <!-- 2. enrich the collection by adding MachineCredential > instances --> > <enrich uri="direct:startMachinesCredentialsRoute" > strategyRef="setMachinesCredentialStrategy" /> > <log message="Retrieved credentials for terminal: > ${body.ipAddress}" /> > > <!-- HERE THE cashReservationsRoute IS CALLED--> > <enrich uri="direct:startCashReservationsRoute" > strategyRef="setCashReservationsStrategy" /> > > <!-- 4.2. Add terminal profile into cache --> > <process ref="setCacheHeadersProcessor" /> > <to uri="cache://credentialsCache" /> > <log message="Updated credentials cache. Key: > ${header.CACHE_KEY} - Value: ${body}" /> > </split> > <process ref="logoutServerProcessor" /> > <to uri="direct:logoutUser" /> > </route> > > What I want to achieve is to ignore any errors raised by the cxf endpoint in > the first route and to continue processing the <split> route. > > What happens is that the DefaultErrorHandler kicks in and simply skips all > the processors following the failing enrich, going straight to the next split > body. > > Here is the log: > > [ default-workqueue-5] terminalsConfiguration INFO > Processing terminal with IP address: 192.168.1.3 > [ default-workqueue-5] route2 INFO Server > token retrieved from token cache. Value: 1310724816172 > [ default-workqueue-5] terminalsConfiguration INFO > Retrieved credentials for terminal: 192.168.1.3 > [ default-workqueue-5] route2 INFO Server > token retrieved from token cache. Value: 1310724816172 > [ default-workqueue-5] cashReservationsRoute INFO > getCashReservations() error ignored > [ default-workqueue-5] DefaultErrorHandler ERROR Failed > delivery for exchangeId: ID-localhost-55736-1310724793588-0-26. Exhausted > after delivery attempt: 1 caught: org.apache.cxf.binding.soap.SoapFault: > Testing only > org.apache.cxf.binding.soap.SoapFault: Testing only > at > org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:75)[cxf-rt-bindings-soap-2.3.2.jar:2.3.2] > at > org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:46)[cxf-rt-bindings-soap-2.3.2.jar:2.3.2] > at > org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:35)[cxf-rt-bindings-soap-2.3.2.jar:2.3.2] > at > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)[cxf-api-2.3.2.jar:2.3.2] > at > org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:99)[cxf-rt-core-2.3.2.jar:2.3.2] > at > org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)[cxf-rt-bindings-soap-2.3.2.jar:2.3.2] > at > org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)[cxf-rt-bindings-soap-2.3.2.jar:2.3.2] > at > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)[cxf-api-2.3.2.jar:2.3.2] > at > org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:737)[cxf-rt-core-2.3.2.jar:2.3.2] > at > org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:2335)[cxf-rt-transports-http-2.3.2.jar:2.3.2] > at > org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream$1.run(HTTPConduit.java:2198)[cxf-rt-transports-http-2.3.2.jar:2.3.2] > at > org.apache.cxf.workqueue.AutomaticWorkQueueImpl$2.run(AutomaticWorkQueueImpl.java:253)[cxf-rt-core-2.3.2.jar:2.3.2] > at > java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)[:1.6.0_26] > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)[:1.6.0_26] > at java.lang.Thread.run(Thread.java:680)[:1.6.0_26] > [ default-workqueue-5] terminalsConfiguration INFO > Processing terminal with IP address: 192.168.1.4 > > > If I configure the route like this: > > <route id="cashReservationsRoute" handleFault="true"> > <from uri="direct:startCashReservationsRoute" /> > > <!-- Prepare GetReservationsCashReportReq --> > <process ref="prepareCashReservationsRequestProcessor" /> > <!-- Add server token to request --> > <enrich uri="direct:getServerToken" > strategyRef="setTokenToGenericRequestStrategy" /> > <doTry> > <to uri="cxf:bean:dgwEndpoint" /> > <log message="Retrieved cash reservations" /> > <doCatch> > <exception>org.apache.cxf.interceptor.Fault</exception> > <log message="getCashReservations() error ignored" /> > <process ref="errorHandlerProcessor" /> <!-- this does > nothing special, simply substitutes the out Fault with an empty bean. It is > not defined in the <onException> otherwise the route would stop processing > there --> > </doCatch> > </doTry> > </route> > > everything works wonderfully, simply because the DefaultErrorHandler is not > used. > > This is the log: > > [ default-workqueue-5] terminalsConfiguration INFO > Processing terminal with IP address: 192.168.1.3 > [ default-workqueue-5] route2 INFO Server > token retrieved from token cache. Value: 1310724676861 > [ default-workqueue-5] terminalsConfiguration INFO > Retrieved credentials for terminal: 192.168.1.3 > [ default-workqueue-5] route2 INFO Server > token retrieved from token cache. Value: 1310724676861 > [ default-workqueue-5] cashReservationsRoute INFO > getCashReservations() error ignored > Testing only > [ default-workqueue-5] terminalsConfiguration INFO Updated > credentials cache. Key: 3619_0003 - Value: > com.ncr.a2e.ing.routes.security.Terminal@1d764a75 > [ default-workqueue-5] terminalsConfiguration INFO > Processing terminal with IP address: 192.168.1.4 > > I have tried using all the different error handlers, no luck. > I have tried to change from "continued" to "handled", no luck. > > I would like to use onException, because it seems the preferred method to > handle exceptions, but I simply cannot do it. > > I think that the fact that doTry...doCatch supersedes the error handling > mechanism should be pointed out in the Camel in Action book.
It does as it states that doTry .. doCatch works in similar ways as try .. catch does in Java. eg if any exception is thrown it will be caught by the catch block. > > Alberto > > -- > View this message in context: > http://camel.465427.n5.nabble.com/onException-vs-doTry-doCatch-tp4590348p4590348.html > Sent from the Camel - Users mailing list archive at Nabble.com. -- Claus Ibsen ----------------- FuseSource Email: cib...@fusesource.com Web: http://fusesource.com Twitter: davsclaus, fusenews Blog: http://davsclaus.blogspot.com/ Author of Camel in Action: http://www.manning.com/ibsen/