Exception handling 为什么Mule异常策略如此健谈?
在我的Mule应用程序中,我配置了一些流,以使用捕获异常策略来执行一些特殊处理。对于这些情况,我希望将错误和原始有效负载弹出到对象存储中。在其他任何地方,默认的异常策略都很好Exception handling 为什么Mule异常策略如此健谈?,exception-handling,mule,Exception Handling,Mule,在我的Mule应用程序中,我配置了一些流,以使用捕获异常策略来执行一些特殊处理。对于这些情况,我希望将错误和原始有效负载弹出到对象存储中。在其他任何地方,默认的异常策略都很好 <flow name="saveLookup"> <vm:inbound-endpoint exchange-pattern="one-way" ref="Lookup_Save_VM" /> <component> <spring-object be
<flow name="saveLookup">
<vm:inbound-endpoint exchange-pattern="one-way" ref="Lookup_Save_VM" />
<component>
<spring-object bean="insertLookupMDCvalues"/>
</component>
<set-variable variableName="originalPayload" value="#[payload]"/>
<json:json-to-object-transformer returnClass="com.company.LookupData"/>
<set-variable variableName="transactionId" value="#[payload.transactionId]"/>
<transactional action="ALWAYS_BEGIN">
<logger message="${lookup.SQL}" level="INFO"/>
<jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="saveLookup" queryTimeout="-1" connector-ref="JdbcConnector" />
<foreach collection="#[payload.transactional.lookupItems.items]">
<logger message="${lookup.item.SQL}" level="INFO" />
<jdbc:outbound-endpoint exchange-pattern="request-response" queryKey="saveLookupItem" queryTimeout="-1" connector-ref="JdbcConnector"/>
</foreach>
</transactional>
<component>
<spring-object bean="clearLookupMDCvalues"/>
</component>
<catch-exception-strategy>
<message-properties-transformer scope="invocation">
<add-message-property key="errorMap" value="#[['id' : transactionId, 'body' : originalPayload, 'error' : exception.summaryMessage]]"/>
</message-properties-transformer>
<choice>
<when expression="#[message.inboundProperties['resubmit']]">
<logger message="Resubmission of lookup data failed, saving to Dead Letter object store. ID=#[transactionId]" level="INFO"/>
<objectstore:store config-ref="lookupDeadLetterOS" key="#[transactionId]" overwrite="true" value-ref="#[errorMap]"/>
</when>
<otherwise>
<logger message="Saving lookup data failed, saving to Error object store. ID=#[transactionId]" level="INFO"/>
<objectstore:store config-ref="lookupErrorOS" key="#[transactionId]" overwrite="true" value-ref="#[errorMap]"/>
</otherwise>
</choice>
<set-payload value="Error: #[exception.summaryMessage]"/>
<component>
<spring-object bean="clearLookupMDCvalues"/>
</component>
</catch-exception-strategy>
</flow>
我的问题是,当遇到错误时,比如说foreach组件中出现空指针异常,我会看到每个事件的四条错误日志语句:
- 异常堆栈为:1。null(java.lang.NullPointerException)…等等。这记录了两次
- CatchMessaginExceptionStrategy-消息:表达式“payload.transactional.lookupItems.items”的执行失败。(org.mule.api.expression.ExpressionRuntimeException)。消息负载的类型为:LookUpdatea
- DefaultMessaginExceptionStrategy-消息:表达式“payload.transactional.lookupItems.items”的执行失败。(org.mule.api.expression.ExpressionRuntimeException)。消息负载的类型为:LookUpdatea
我认为特定于流的异常策略应该覆盖默认策略。为什么会有重复的日志消息,有没有办法将其关闭?我希望避免必须配置默认异常策略,因为它在大多数流中都是完全可以接受的行为。问题是,内置异常策略继承自
AbstractExceptionListener
,它们都使用logException
模板方法。基本实现总是以错误级别记录日志,这有时不适合您的应用程序
您可以创建CatchMessaginExceptionStrategy的一个简单子类,该子类重写logException方法,并根据需要记录日志。然后,在流程中使用它来代替
,如下所示:
<custom-exception-strategy class="com.mycompany.mule.QuietCatchExceptionStrategy">
<!-- your message processors here -->
</custom-exception-strategy>
这对我很有效,添加了一个步骤,将
中的所有处理器包装到
中。让两个日志都记录相同的、冗长的消息似乎仍然有些过分,但是,这就是生活。