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
The default exception strategy set the payload of the message to NullPayload after handling an exception. This behavior is relevant when there are different flows (for example, out and in ). Assume that out has a Flow reference ( flow-ref ) to in and an exception strategy, but in has no exception strategy.
A catch exception strategy can contain any number of message processors. You can define only one exception strategy for each flow.
It's easy to implement in Mule 4. Just define your exception handling in separate flow using error scope along with on error propagate and on error continue and call it from main flow or wherever. Using Error handler ref:::Which you need to write manually in XML.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With