【问题标题】:Mule- Exception Handling with Choice and Catch give strange errorMule- 使用 Choice 和 Catch 处理异常会给出奇怪的错误
【发布时间】:2018-01-05 03:57:11
【问题描述】:

我正在尝试在 Mule 运行时 3.8.0 中实现异常处理。据我所知,我做的一切都是正确的,但仍然出现奇怪的错误:

我的代码如下: 参考异常策略的主要流程:

<flow name="mod4Flow2">
    <http:listener config-ref="HTTP_Listener_Configuration" path="/sg" doc:name="HTTP"/>
    <scatter-gather doc:name="Scatter-Gather">
        <flow-ref name="mod4Sub_Flow" doc:name="mod4Sub_Flow"/>
        <flow-ref name="mod4Sub_Flow1" doc:name=""/>
        <flow-ref name="mod4Sub_Flow2" doc:name=""/>
    </scatter-gather>
    <logger message="Combined payload : #[message.payload]" level="INFO" doc:name="Logger"/>
    <exception-strategy ref="exceptionconfigChoice_Exception_Strategy" doc:name="Reference Exception Strategy"/>
</flow>
<sub-flow name="mod4Sub_Flow">
    <set-payload value="From mod4Sub_Flow" doc:name="Set Payload"/>
</sub-flow>
<sub-flow name="mod4Sub_Flow1">
    <set-payload value="From mod4Sub_Flow1" doc:name="Set Payload"/>
</sub-flow>
<sub-flow name="mod4Sub_Flow2">
    <set-payload value="From mod4Sub_Flow2" doc:name="Set Payload"/>
</sub-flow>

单独配置文件中的全局异常策略“:

 <choice-exception-strategy name="exceptionconfigChoice_Exception_Strategy">
    <catch-exception-strategy doc:name="Catch Exception Strategy-UnSupported Operation" when="#[exception.causedBy(java.lang.UnsupportedOperationException)]">
        <set-property propertyName="http.status" value="400" doc:name="Property"/>
        <logger message="The exception is : #[exception]" level="INFO" doc:name="Logger"/>
        <set-payload value="Something wrong in Scatter-Gather !" doc:name="Set Payload"/>
    </catch-exception-strategy>
    <catch-exception-strategy doc:name="Catch Exception Strategy - SQL" when="#[exception.causeMatches('java.sql.*')]">
    <set-property propertyName="http.status" value="400" doc:name="Property"/>
        <logger message="The exception is : #[exception]" level="INFO" doc:name="Logger"/>
        <set-payload value="Something wrong in DB !" doc:name="Set Payload"/>
    </catch-exception-strategy>
</choice-exception-strategy>

运行时出现以下异常:

    ERROR 2018-01-04 21:01:46,704 [[mod4].HTTP_Listener_Configuration.worker.01] org.mule.exception.DefaultSystemExceptionStrategy: Caught exception in Exception Strategy: Execution of the expression "exception.causedBy(java.lang.UnsupportedOperationException)" failed.
org.mule.api.expression.ExpressionRuntimeException: Execution of the expression "exception.causedBy(java.lang.UnsupportedOperationException)" failed.
    at org.mule.el.mvel.MVELExpressionLanguage.evaluateInternal(MVELExpressionLanguage.java:232) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.el.mvel.MVELExpressionLanguage.evaluate(MVELExpressionLanguage.java:163) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.el.mvel.MVELExpressionLanguage.evaluate(MVELExpressionLanguage.java:142) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.expression.DefaultExpressionManager.evaluate(DefaultExpressionManager.java:216) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.expression.DefaultExpressionManager.evaluateBoolean(DefaultExpressionManager.java:417) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.expression.DefaultExpressionManager.evaluateBoolean(DefaultExpressionManager.java:674) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.exception.TemplateMessagingExceptionStrategy.accept(TemplateMessagingExceptionStrategy.java:191) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.exception.ChoiceMessagingExceptionStrategy.handleException(ChoiceMessagingExceptionStrategy.java:55) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.execution.AsyncResponseFlowProcessingPhase$3$1.execute(AsyncResponseFlowProcessingPhase.java:131) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.execution.AsyncResponseFlowProcessingPhase.executeCallback(AsyncResponseFlowProcessingPhase.java:144) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.execution.AsyncResponseFlowProcessingPhase.access$000(AsyncResponseFlowProcessingPhase.java:35) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.execution.AsyncResponseFlowProcessingPhase$3.responseSentWithFailure(AsyncResponseFlowProcessingPhase.java:125) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.module.http.internal.listener.HttpMessageProcessorTemplate.doBuildResponse(HttpMessageProcessorTemplate.java:129) ~[mule-module-http-3.8.0.jar:3.8.0]
    at org.mule.module.http.internal.listener.HttpMessageProcessorTemplate.buildResponse(HttpMessageProcessorTemplate.java:112) ~[mule-module-http-3.8.0.jar:3.8.0]
    at org.mule.module.http.internal.listener.HttpMessageProcessorTemplate.sendResponseToClient(HttpMessageProcessorTemplate.java:86) ~[mule-module-http-3.8.0.jar:3.8.0]
    at org.mule.execution.AsyncResponseFlowProcessingPhase.runPhase(AsyncResponseFlowProcessingPhase.java:78) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.execution.AsyncResponseFlowProcessingPhase.runPhase(AsyncResponseFlowProcessingPhase.java:35) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.execution.PhaseExecutionEngine$InternalPhaseExecutionEngine.phaseSuccessfully(PhaseExecutionEngine.java:65) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.execution.PhaseExecutionEngine$InternalPhaseExecutionEngine.phaseSuccessfully(PhaseExecutionEngine.java:69) ~[mule-core-3.8.0.jar:3.8.0]
    at com.mulesoft.mule.throttling.ThrottlingPhase.runPhase(ThrottlingPhase.java:186) ~[mule-module-throttling-ee-3.8.0.jar:3.8.0]
    at com.mulesoft.mule.throttling.ThrottlingPhase.runPhase(ThrottlingPhase.java:57) ~[mule-module-throttling-ee-3.8.0.jar:3.8.0]
    at org.mule.execution.PhaseExecutionEngine$InternalPhaseExecutionEngine.phaseSuccessfully(PhaseExecutionEngine.java:65) ~[mule-core-3.8.0.jar:3.8.0]
    at com.mulesoft.gateway.http.phases.GatewayValidationPhase.runPhase(GatewayValidationPhase.java:93) ~[gateway-core-3.8.0.jar:3.8.0]
    at com.mulesoft.gateway.http.phases.GatewayValidationPhase.runPhase(GatewayValidationPhase.java:49) ~[gateway-core-3.8.0.jar:3.8.0]
    at org.mule.execution.PhaseExecutionEngine$InternalPhaseExecutionEngine.phaseSuccessfully(PhaseExecutionEngine.java:65) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.modules.cors.CorsPhase.runPhase(CorsPhase.java:113) ~[mule-module-cors-gw-3.8.0.jar:3.8.0]
    at org.mule.modules.cors.CorsPhase.runPhase(CorsPhase.java:40) ~[mule-module-cors-gw-3.8.0.jar:3.8.0]
    at org.mule.execution.PhaseExecutionEngine$InternalPhaseExecutionEngine.process(PhaseExecutionEngine.java:114) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.execution.PhaseExecutionEngine.process(PhaseExecutionEngine.java:41) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.execution.MuleMessageProcessingManager.processMessage(MuleMessageProcessingManager.java:32) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.module.http.internal.listener.DefaultHttpListener$1.handleRequest(DefaultHttpListener.java:133) ~[mule-module-http-3.8.0.jar:3.8.0]
    at org.mule.module.http.internal.listener.grizzly.GrizzlyRequestDispatcherFilter.handleRead(GrizzlyRequestDispatcherFilter.java:83) ~[mule-module-http-3.8.0.jar:3.8.0]
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) ~[grizzly-framework-2.3.24.jar:2.3.24]
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284) ~[grizzly-framework-2.3.24.jar:2.3.24]
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201) ~[grizzly-framework-2.3.24.jar:2.3.24]
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133) ~[grizzly-framework-2.3.24.jar:2.3.24]
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) ~[grizzly-framework-2.3.24.jar:2.3.24]
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) ~[grizzly-framework-2.3.24.jar:2.3.24]
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:526) ~[grizzly-framework-2.3.24.jar:2.3.24]
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) ~[grizzly-framework-2.3.24.jar:2.3.24]
    at org.mule.module.http.internal.listener.grizzly.ExecutorPerServerAddressIOStrategy.run0(ExecutorPerServerAddressIOStrategy.java:102) ~[mule-module-http-3.8.0.jar:3.8.0]
    at org.mule.module.http.internal.listener.grizzly.ExecutorPerServerAddressIOStrategy.access$100(ExecutorPerServerAddressIOStrategy.java:30) ~[mule-module-http-3.8.0.jar:3.8.0]
    at org.mule.module.http.internal.listener.grizzly.ExecutorPerServerAddressIOStrategy$WorkerThreadRunnable.run(ExecutorPerServerAddressIOStrategy.java:125) ~[mule-module-http-3.8.0.jar:3.8.0]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_131]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_131]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]
Caused by: org.mule.mvel2.PropertyAccessException: [Error: unable to resolve method: java.lang.RuntimeException.causedBy(java.lang.Class) [arglength=1]]
[Near : {... exception.causedBy(java.lang.U ....}]
             ^
[Line: 1, Column: 1]
    at org.mule.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:1178) ~[mule-mvel2-2.1.9-MULE-010.jar:?]
    at org.mule.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:1087) ~[mule-mvel2-2.1.9-MULE-010.jar:?]
    at org.mule.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:415) ~[mule-mvel2-2.1.9-MULE-010.jar:?]
    at org.mule.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:212) ~[mule-mvel2-2.1.9-MULE-010.jar:?]
    at org.mule.mvel2.ast.ASTNode.optimize(ASTNode.java:159) ~[mule-mvel2-2.1.9-MULE-010.jar:?]
    at org.mule.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:115) ~[mule-mvel2-2.1.9-MULE-010.jar:?]
    at org.mule.mvel2.MVELRuntime.execute(MVELRuntime.java:86) ~[mule-mvel2-2.1.9-MULE-010.jar:?]
    at org.mule.mvel2.compiler.CompiledExpression.getDirectValue(CompiledExpression.java:123) ~[mule-mvel2-2.1.9-MULE-010.jar:?]
    at org.mule.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:119) ~[mule-mvel2-2.1.9-MULE-010.jar:?]
    at org.mule.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:113) ~[mule-mvel2-2.1.9-MULE-010.jar:?]
    at org.mule.mvel2.MVEL.executeExpression(MVEL.java:953) ~[mule-mvel2-2.1.9-MULE-010.jar:?]
    at org.mule.el.mvel.MVELExpressionExecutor.execute(MVELExpressionExecutor.java:87) ~[mule-core-3.8.0.jar:3.8.0]
    at org.mule.el.mvel.MVELExpressionLanguage.evaluateInternal(MVELExpressionLanguage.java:228) ~[mule-core-3.8.0.jar:3.8.0]
    ... 45 more

【问题讨论】:

  • 你解决了吗?

标签: exception-handling mule


【解决方案1】:

在你的全局异常配置xml中,尝试替换

when="#[exception.causedBy(java.lang.UnsupportedOperationException)]"

when="exception.causedBy(java.lang.UnsupportedOperationException)"

也替换

when="#[exception.causeMatches('java.sql.*')]"

when="exception.causeMatches('java.sql.*')"

【讨论】:

    【解决方案2】:

    从您的代码中,我假设当您捕获既不是 java.lang.UnsupportedOperationException 或 java.sql.* 类型的错误时,就会引发此错误?

    如果是这样,那是因为 Mule 在转换您的有效负载时遇到问题,从 scatter-gather 组件到 Http Response 对象的 java.util.concurrent.CopyOnWriteArrayList 对象。

    尝试添加一个默认的 Catch Exception Strategy 来覆盖有效负载。

    <catch-exception-strategy doc:name="Catch Exception Strategy">
        <set-property propertyName="http.status" value="400" doc:name="Property"/>
        <logger message="The exception is : #[exception]" level="INFO" doc:name="Logger"/>
        <set-payload value="Something wrong in DB !" doc:name="Set Payload"/>
    </catch-exception-strategy>
    

    让我知道这是否消除了错误?

    【讨论】:

    • 抛出的错误是“java.lang.UnsupportedOperationException”。为此我已经抓到了。但它为#[exception.causedBy(java.lang.UnsupportedOperationException)] 抛出异常。根据文档,这看起来是正确的。
    • 试图将 CopyOnWriteArrayList 转换为 Http Response 对象也会引发 UnsupportedOperationException。你试过我的建议了吗?
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多