【问题标题】:Mule always use the default exception handlerMule 总是使用默认的异常处理程序
【发布时间】:2018-05-09 18:24:27
【问题描述】:

我无法捕获由 Poller 组件触发的基本 org.mule 异常,Mule 仍在使用默认机制(已尝试全局或本地)

如果抛出以下异常,我想在 Log it self 中打印一些个人内容以用于测试目的,一旦正常工作,将会进行进一步的增强。

Message               : Failed to move file "C:\Users\Administrator\Desktop\shared_folder\12131551.XML" to "C:\Users\Administrator\Desktop\archive\backup\12131551.XML.backup".  The file might already exist.
Code                  : MULE_ERROR-3
Exception stack is:
1. Failed to move file "C:\Users\Administrator\Desktop\shared_folder\12131551.XML" to "C:\Users\Administrator\Desktop\archive\backup\12131551.XML.backup".  The file might already exist. (org.mule.api.DefaultMuleException)
  org.mule.transport.file.FileMessageReceiver:553 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/DefaultMuleException.html)

Root Exception stack trace:
org.mule.api.DefaultMuleException: Failed to move file "C:\Users\Administrator\Desktop\shared_folder\12131551.XML" to "C:\Users\Administrator\Desktop\archive\backup\12131551.XML.backup".  The file might already exist.
    at org.mule.transport.file.FileMessageReceiver.moveAndDelete(FileMessageReceiver.java:553)
    at org.mule.transport.file.FileMessageReceiver.access$400(FileMessageReceiver.java:62)
    at org.mule.transport.file.FileMessageReceiver$2.process(FileMessageReceiver.java:414)
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)

这是我的 PoC

<file:connector name="XML_poller" autoDelete="false" streaming="false" validateConnections="true" pollingFrequency="5000" doc:name="File"/>
<file:connector name="output" doc:name="File" autoDelete="false" streaming="false" validateConnections="true"/>

<flow name="exceptionStrategyExample" doc:name="exceptionStrategyExample">
        <file:inbound-endpoint connector-ref="XML_poller" path="C:\Users\Administrator\Desktop\shared_folder" moveToDirectory="C:\Users\Administrator\Desktop\archive\backup"
            moveToPattern="#[header:originalFilename].backup" doc:name="Poller" responseTimeout="10000">
            <file:filename-wildcard-filter pattern="*.xml" caseSensitive="false"/>
        </file:inbound-endpoint>
        <http:outbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" method="POST" doc:name="HTTP"/>

    <choice-exception-strategy>
        <rollback-exception-strategy
                when="exception.causedBy(java.lang.IllegalStateException)"
                maxRedeliveryAttempts="3">
                <logger message="Retrying shipping cost calc." level="WARN" />
                <on-redelivery-attempts-exceeded>
                <logger message="Too many retries shipping cost calc."
                level="WARN" />
                <set-payload value="Error: #[exception.summaryMessage]"/>
                </on-redelivery-attempts-exceeded>
        </rollback-exception-strategy>
         <catch-exception-strategy  doc:name="Catch Exception Strategy" when="exception.causedBy(org.mule.*)">
                    <logger message="************TEST***************" level="INFO" doc:name="Logger"/>
        </catch-exception-strategy>
    </choice-exception-strategy>    
</flow>

根本就是什么都没做……有什么提示吗?

【问题讨论】:

    标签: exception-handling mule mule-studio


    【解决方案1】:

    我认为这是系统异常的情况,其中没有创建可以被异常处理组件捕获的消息(请参阅Mule docs 以了解系统与消息异常)。您可以尝试编写一个覆盖 processFile 方法的自定义消息接收器(请参阅this post 以获得灵感),或者手动检查是否存在重复文件并使用单独的 file:outbound-endpoint 来编写文件。

    【讨论】:

    • 深入日志我发现Mule仍在调用org.mule.exception.DefaultSystemExceptionStrategy
    • 那么我该如何覆盖 SystemExceptionStrategy ??
    • 您应该能够使用 MuleContext.setExceptionListener 设置自己的处理程序,并且您可以实现 MuleContextAware Spring bean 来访问 MuleContext。不过,我自己从未尝试过,因此请参阅相关类的文档/源代码以获取更多信息。
    【解决方案2】:

    我找到了解决方法。在文件连接器之前插入一个处理器链元素并放置一个虚拟set-payload。这样,您将始终创建一条消息,然后它就不会使用DefaultExceptionStrategy 来处理错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      相关资源
      最近更新 更多