Exception handling 为什么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

在我的Mule应用程序中,我配置了一些流,以使用捕获异常策略来执行一些特殊处理。对于这些情况,我希望将错误和原始有效负载弹出到对象存储中。在其他任何地方,默认的异常策略都很好

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

这对我很有效,添加了一个步骤,将
中的所有处理器包装到
中。让两个日志都记录相同的、冗长的消息似乎仍然有些过分,但是,这就是生活。