6

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
Joel Peltonen
  • 13,025
  • 6
  • 64
  • 100

4 Answers4

3

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

Ryan Carter
  • 11,441
  • 2
  • 20
  • 27
0

You have to use inside your flow to catch the exception and perform the notification.

<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>
    <catch-exception-strategy>
        <vm:outbound-endpoint path="generalErrorHandler" exchange-pattern="one-way" />
    </catch-exception-strategy>
</flow>

Hope this helps.

user1760178
  • 6,277
  • 5
  • 27
  • 57
  • Hey, thanks for the answer. I did not -1 you, but I did try this; I could not deploy my app with that set, I got: `Eexception is org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'catch-exception-strategy'. One of '{"http://.../core":abstract-message-processor, "http://.../core":abstract-outbound-endpoint, "http://.../core":response, "http://.../core":abstract-exception-strategy, "http://.../core":threading-profile}' is expected.` – Joel Peltonen Feb 23 '15 at 07:34
  • @DownVoter. Care to comment. – user1760178 Feb 23 '15 at 14:34
  • because catch-exception-strategy was not available in v3.1.x. catch-exception-strategy is relatively new and default-exception-strategy is correct prior to v3.3.x – jon lee Feb 24 '15 at 13:05
  • `catch-exception-strategy` is only available from Mule 3.3 IIRC (perhaps that caused the downvote). – Anders R. Bystrup Feb 24 '15 at 13:51
  • Thanks for the clarification. I didn't check the Mule verison in the question. – user1760178 Feb 24 '15 at 18:55
0

As mentioned, you need to use a catch exception strategy, the default one will just log the exception. Also, instead of using a VM outbound endpoint to reach the error handler in an other flow, you could define the catch exception strategy as a global exception strategy. You can find more information on all that here.

afelisatti
  • 2,770
  • 1
  • 13
  • 21
  • I tried that, but catch-exception-strategy does not seem to be supported, I get ab exception saying `Invalid content was found starting with element 'catch-exception-strategy'`. Please note that I'm on Mule 3.1.0. – Joel Peltonen Feb 23 '15 at 07:35
  • I didn't -1 you though. – Joel Peltonen Feb 23 '15 at 07:38
  • Have you tried using just a simple logging component before the vm outbound endpoint and after the vm inbound endpoint to see whether the exception strategy is actually executing the inner message processors or not? – afelisatti Feb 23 '15 at 12:20
  • I tried adding a logger statement after `inbound-endpoint`, `cxf:jaxws-service` and `component`. I can see the first two but never the 3rd! Also added loggers to a bunch of other places, but they never fire either. – Joel Peltonen Feb 23 '15 at 13:35
  • And a logger before the `vm:outbound-endpoint` does not show? What about after the `vm:inbound-endpoint`? I'm not very familiar with mule 3.1.0 but looking at mule-hello-example I'd try configuring the `vm:inbound-endpoint`'s exchange pattern as request-response: `````` – afelisatti Feb 25 '15 at 12:29
  • Yeah, I tried a logger in both those places and they didn't show. I also tried `request-response` but alas, nothing happened :c – Joel Peltonen Feb 25 '15 at 13:45
-2

use below as part of choice based exception strategy for your flow
<choice-exception-strategy> <catch-exception-strategy when="#[exception.causedBy(java.lang.Exception)]" doc:name="Catch Exception Strategy"> <vm:outbound-endpoint path="generalErrorHandler" exchange-pattern="one-way" /> </catch-exception-strategy></choice-exception-strategy>

Mohan
  • 520
  • 4
  • 16
  • Hi! Thanks, but I tried that, but I got `Invalid content was found starting with element 'choice-exception-strategy'.` I didn't -1 you though. – Joel Peltonen Feb 23 '15 at 07:37