在我们的应用程序中,我们有错误处理机制,我们在错误上抛出运行时异常。我注意到一个奇怪的行为,我想了解这个基础的机制
1)情况1:从ServiceActivator抛出的异常被转换为MessageHandlingException
当ServiceActivator发生错误时,我们抛出异常。我们在ErrorChannel上收到的消息的PayLoad为org.springframework.integration.MessageHandlingException
,实际异常抛出为 cause
2)情况2:使用MessageHandlingException
不屏蔽Filter抛出的异常当Filter中发生错误,并且我们抛出异常时,PayLoad是实际异常,并且不会被org.springframework.integration.MessageHandlingException
我有几个问题:
更新1:
Filter扩展AbstractFileListFilter,它是过滤器链的一部分 - 一个实现FileListFilter的自定义CompositeFileFilter
CompositeFileFilter由一个文件使用:inbound-channel-adapter,它将输出传递给下面声明的Channel:
<int:channel
id="channelForFilesComingIn"
datatype="java.io.File"
>
<int:dispatcher task-executor="dispatchExecutor" />
</int:channel>
更新2:
我们要做的是从文件系统读取文件并处理它们。在文件读取部分中,使用带有CompositeFilter的file:inbound-channel-adapter
来过滤未完全上载或不符合命名标准的文件。
在所有过滤器通过后,文件将被移交给ServiceActivator进行处理
在上述任何一种情况下(过滤链或服务),如果出现错误情况,则必须通过电子邮件向DB报告。为了实现这一点,我们抛出了由errorChannel捕获的ApplicationException,并传递给专门的通道。
答案 0 :(得分:0)
为了说清楚,当Message HANDLER失败时抛出MessageHandlingException
(包装用户异常) - 消息处理程序是处理消息的东西。
如果MessageSource
中出现异常,则表示尚无消息,因此MessageHandlingException
(或任何MessagingException
)不适用。
相反,轮询失败,异常被抛回轮询器。
如果要处理轮询端点(MessageSource
)中的异常,则需要向轮询器ErrorHandlingTaskExecutor
提供ErrorHandler
,并为此提供MessageSource
并执行您想要的操作除了例外,但由于还没有消息,它是ErrorHandler
抛出的原始异常。
如果您想将其发送到错误频道,则需要在自定义{{1}}中执行此操作。