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.
>

When using Enrich you can/should handle exceptions in the aggregation strategy.
See section 8.3.5 in the book.


> 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.
>
> 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