在我们的应用程序中,我们有错误处理机制,我们在错误中抛出运行时异常。我注意到一个奇怪的行为,我想了解这个行为背后的机制
1)情况一:ServiceActivator抛出的异常转化为MessageHandlingException
当 ServiceActivator 发生错误时,我们会抛出异常。我们在 ErrorChannel 上收到的消息有 PayLoadorg.springframework.integration.MessageHandlingException
和实际抛出的异常 cause
2) 情况 2:Filter 抛出的异常没有被 MessageHandlingException 屏蔽
当 Filter 发生错误,我们抛出异常时,PayLoad 是实际异常,不会被org.springframework.integration.MessageHandlingException
我有几个问题:
- 为什么从 ServiceActivator 抛出的异常行为与在 Filter 中不同
- 在使用 errorChannel 和相关基础设施的同时,在 Spring 集成项目中是否有一些围绕错误处理的“最佳实践”
更新1:
过滤器扩展了作为过滤器链一部分的 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,并传递给专门的通道。