Почему по умолчанию-исключение-стратегии потока мул не имеют никакого эффекта?


Я использую Mule standalone 3.1.0, и у меня есть поток со стратегией исключений по умолчанию. Мой fooImpl класс специально создает исключение, и его stacktrace рвется на мула stdout - ExceptionTransformer не срабатывает, и я не получаю электронной почты. Если я удалю default-exception-strategy Полностью, ничего не изменится.

Я хочу, чтобы он отправил электронное письмо и напечатал исключение с ExceptionTransformer. Что я делаю не так?

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

Далее я попытался использовать <custom-exception-strategy class="com.arcusys.nkeservice.mule.dynasty.ExceptionTest"> вместо default-exception-strategy. Затем ExceptionTest получает экземпляр во время запуска службы, но @override handleException Никогда не вызывается.

Мое вынужденное исключение, которое я получаю в stdout, выглядит так:

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
4 6

4 ответа:

Вы должны использовать внутри вашего потока, чтобы поймать исключение и выполнить уведомление.

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

Надеюсь, это поможет.

Как уже упоминалось, вам нужно использовать стратегию catch exception, которая по умолчанию будет просто регистрировать исключение. Кроме того, вместо использования исходящей конечной точки виртуальной машины для достижения обработчика ошибок в другом потоке можно определить стратегию исключения catch как глобальную стратегию исключения. Вы можете найти дополнительную информацию обо всем этом здесь.

Используйте ниже как часть стратегии исключения на основе выбора для вашего потока
<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>