【发布时间】:2013-01-09 19:16:39
【问题描述】:
在我们的应用程序中,我们有错误处理机制,我们在错误中抛出运行时异常。我注意到一个奇怪的行为,我想了解这个行为背后的机制
1) 情况一:ServiceActivator抛出的异常转化为MessageHandlingException
当 ServiceActivator 发生错误时,我们会抛出异常。我们在 ErrorChannel 上收到的消息有 PayLoad 为 org.springframework.integration.MessageHandlingException,实际抛出的异常为 cause
2) 情况 2:Filter 抛出的异常没有被 MessageHandlingException 屏蔽
当Filter发生错误,我们抛出异常时,PayLoad是实际异常,不会被org.springframework.integration.MessageHandlingException屏蔽
我有几个问题:
- 为什么从 ServiceActivator 抛出的异常与在过滤器中的行为不同
- 在使用 errorChannel 和相关基础架构时,是否有一些围绕 Spring 集成项目中的错误处理的“最佳实践”
更新 1:
Filter 扩展了作为过滤器链一部分的 AbstractFileListFilter - 实现 FileListFilter 的自定义 CompositeFileFilter
CompositeFileFilter 被 file:inbound-channel-adapter 使用,并将输出传递到下面声明的 Channel:
<int:channel
id="channelForFilesComingIn"
datatype="java.io.File"
>
<int:dispatcher task-executor="dispatchExecutor" />
</int:channel>
更新 2:
我们试图做的是从文件系统中读取文件并处理它们。在文件读取部分,使用 file:inbound-channel-adapter 和 CompositeFilter 过滤未完全上传或不符合命名标准的文件。
所有过滤器通过后,将文件交给ServiceActivator进行处理
在上述任何一个(过滤器链或服务)中,如果出现错误情况,必须将其报告给数据库并通过电子邮件报告。为了实现这一点,我们抛出了由 errorChannel 捕获的 ApplicationException,并传递给专门的通道。
【问题讨论】:
-
您使用的是什么版本的 Spring Integration?我刚刚运行了一个测试,从过滤器中抛出了一个异常,并按预期收到了 MessageHandlingException。请提供更多详细信息,包括配置。
-
我使用的是 2.1.4。我在调试会话中注意到了这种行为。我正在为问题附上更多细节。
-
我以为您在谈论
元素,考虑到您将它与 进行比较。文件列表过滤器在 MessageSource 中使用,它不是直接调用的组件。也许您可以分享更多关于您正在尝试做什么的信息。 -
添加了更多详细信息,不确定它们是否对您有所帮助。告诉我