Why does Mule flow default-exception-strategy have no effect?

cxf, java, jax-ws, mule, web-services

Solution

There was problems with CXF components invoking exception strategies prior to Mule 3.1.3:

http://mule.1045714.n5.nabble.com/mule-scm-mule-22344-branches-mule-3-1-x-modules-cxf-src-test-resources-EE-2273-td4557349.html

EE-2273 - http://www.mulesoft.org/documentation/display/current/Mule+ESB+3.1.3+Release+Notes

Problem

I'm using Mule standalone 3.1.0 and I have a flow with a default exception strategy. My `fooImpl` class throws an exception on purpose and its stacktrace gets vomited onto the mule stdout - `ExceptionTransformer` is not triggered and I get no email. If I remove the `default-exception-strategy` completely nothing at all changes. I want it to send an email and print the exception with `ExceptionTransformer`. What am I doing wrong? ``` <flow name="fooService"> <inbound-endpoint address="http://localhost:63082/foo" exchange-pattern="request-response" /> <cxf:jaxws-service serviceClass="com.example.mule.foo.fooImpl" /> <component class="com.example.mule.foo.fooImpl" /> <all> <file:outbound-endpoint path="/home/hodor/mule-standalone-3.1.0/old/" outputPattern="foo_#[function:datestamp].xml" /> <stdio:outbound-endpoint system="OUT" exchange-pattern="one-way" connector-ref="stdioConnector" transformer-refs="objectToInputStream"/> </all> <default-exception-strategy> <vm:outbound-endpoint path="generalErrorHandler" exchange-pattern="one-way" /> </default-exception-strategy> </flow> <flow name="generalErrorHandler"> <vm:inbound-endpoint path="generalErrorHandler" exchange-pattern="one-way" /> <custom-transformer class="com.example.mule.foo.ExceptionTransformer" /> <all> <smtp:outbound-endpoint host="${error.smtp.host}" port="${error.smtp.port}" subject="${error.smtp.subject}" to="${error.smtp.to}" cc="${error.smtp.cc}" bcc="${error.smtp.bcc}" from="${error.smtp.sender}" /> </all> </flow> ``` Further on, I tried to use `<custom-exception-strategy class="com.arcusys.nkeservice.mule.dynasty.ExceptionTest">` instead of `default-exception-strategy`. Then `ExceptionTest` gets instantiated during service startup, but `@override handleException` never gets called. My forced exception I get to stdout is like this: ``` WARN 2015-02-23 10:59:17,159 [[foo].connector.http.0.receiver.2] org.apache.cxf.phase.PhaseInterceptorChain: Interceptor for {http://foo.com/}FooImplService#{http://foo.com/}getCase has thrown exception, unwinding now org.apache.cxf.interceptor.Fault: Component that caused exception is: org.mule.component.DefaultJavaComponent component for: SimpleFlowConstruct{fooService}. Message payload is of type: Object[] at org.mule.module.cxf.MuleInvoker.invoke(MuleInvoker.java:85) at org.mule.module.cxf.MuleJAXWSInvoker.invoke(MuleJAXWSInvoker.java:47) at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:75) at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37) at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:106) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:247) at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:113) at org.mule.module.cxf.CxfInboundMessageProcessor.sendToDestination(CxfInboundMessageProcessor.java:292) at org.mule.module.cxf.CxfInboundMessageProcessor.process(CxfInboundMessageProcessor.java:131) at org.mule.module.cxf.config.FlowConfiguringMessageProcessor.process(FlowConfiguringMessageProcessor.java:50) at org.mule.processor.AbstractInterceptingMessageProcessor.processNext(AbstractInterceptingMessageProcessor.java:75) at org.mule.processor.AsyncInterceptingMessageProcessor.process(AsyncInterceptingMessageProcessor.java:103) at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:62) at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:90) at org.mule.processor.AbstractInterceptingMessageProcessor.processNext(AbstractInterceptingMessageProcessor.java:75) at org.mule.interceptor.AbstractEnvelopeInterceptor.process(AbstractEnvelopeInterceptor.java:55) at org.mule.processor.AbstractInterceptingMessageProcessor.processNext(AbstractInterceptingMessageProcessor.java:75) at org.mule.interceptor.AbstractEnvelopeInterceptor.process(AbstractEnvelopeInterceptor.java:55) at org.mule.processor.AbstractInterceptingMessageProcessor.processNext(AbstractInterceptingMessageProcessor.java:75) at org.mule.processor.AbstractFilteringMessageProcessor.process(AbstractFilteringMessageProcessor.java:41) at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:62) at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:90) at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:60) at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:90) at org.mule.construct.AbstractFlowConstruct$1$1.process(AbstractFlowConstruct.java:107) at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:62) at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:90) at org.mule.processor.AbstractInterceptingMessageProcessor.processNext(AbstractInterceptingMessageProcessor.java:75) at org.mule.processor.ExceptionHandlingMessageProcessor.process(ExceptionHandlingMessageProcessor.java:25) at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:62) at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:90) at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:60) at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:90) at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:62) at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:90) at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:60) at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:90) at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:188) at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:161) at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:148) at org.mule.transport.http.HttpMessageReceiver$HttpWorker.doRequest(HttpMessageReceiver.java:247) at org.mule.transport.http.HttpMessageReceiver$HttpWorker.processRequest(HttpMessageReceiver.java:206) at org.mule.transport.http.HttpMessageReceiver$HttpWorker.run(HttpMessageReceiver.java:164) at org.mule.work.WorkerContext.run(WorkerContext.java:309) at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061) at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575) at java.lang.Thread.run(Thread.java:745) Caused by: org.mule.component.ComponentException: Component that caused exception is: org.mule.component.DefaultJavaComponent component for: SimpleFlowConstruct{fooService}. Message payload is of type: Object[] at org.mule.component.DefaultComponentLifecycleAdapter.invoke(DefaultComponentLifecycleAdapter.java:359) at org.mule.component.AbstractJavaComponent.invokeComponentInstance(AbstractJavaComponent.java:89) at org.mule.component.AbstractJavaComponent.doInvoke(AbstractJavaComponent.java:80) at org.mule.component.AbstractComponent.invokeInternal(AbstractComponent.java:114) at org.mule.component.AbstractComponent.access$000(AbstractComponent.java:52) at org.mule.component.AbstractComponent$1.process(AbstractComponent.java:236) at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:62) at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:90) at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:60) at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:90) at org.mule.component.AbstractComponent.process(AbstractComponent.java:147) at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:62) at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:90) at org.mule.module.cxf.CxfInboundMessageProcessor.processNext(CxfInboundMessageProcessor.java:334) at org.mule.module.cxf.MuleInvoker.invoke(MuleInvoker.java:80) ... 49 more Caused by: java.io.IOException: Test IOException at com.foo.FooImpl.getCase(FooImpl.java:240) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.mule.model.resolvers.AbstractEntryPointResolver.invokeMethod(AbstractEntryPointResolver.java:151) at org.mule.model.resolvers.MethodHeaderPropertyEntryPointResolver.invoke(MethodHeaderPropertyEntryPointResolver.java:112) at org.mule.model.resolvers.DefaultEntryPointResolverSet.invoke(DefaultEntryPointResolverSet.java:39) at org.mule.component.DefaultComponentLifecycleAdapter.invoke(DefaultComponentLifecycleAdapter.java:350) ... 63 more ```

Original source