Why doesn't mule flow-exception-strategy have an effect?

I am using Mule standalone 3.1.0 and I have a thread with a standard exception strategy. My fooImpl class throws an exception specifically, and its stacktrace breaks on mule stdout - the ExceptionTransformer does not fire, and I do not receive any message. If I remove the default-exception-strategy , then nothing will change completely.

I want him to send an email and print the exception using 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> 

Next I tried to use <custom-exception-strategy class="com.arcusys.nkeservice.mule.dynasty.ExceptionTest"> instead of default-exception-strategy . An ExceptionTest is @override handleException when the service starts, but @override handleException never @override handleException .

My forced exception that I get in stdout is as follows:

 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 
+6
source share
4 answers

You must use inside your thread to catch the exception and execute 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.

0
source

As already mentioned, you need to use the catch exception strategy, by default it will just log the exception. In addition, instead of using the outgoing VM endpoint to access the error handler in another thread, you can define a catch exception strategy as a global exception strategy. You can find more information about all this here .

0
source

use below as part of an exception-based exception strategy for your thread
<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>

-2
source

Source: https://habr.com/ru/post/982784/


All Articles