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/

Reply via email to