Spring 从ServiceActivator和筛选器引发异常的行为不同
在我们的应用程序中,我们有错误处理机制,我们在错误上抛出运行时异常。我注意到一种奇怪的行为,我想了解这种行为背后的机制 1) 情况1:ServiceActivator引发的异常转换为MessageHandlingException 当ServiceActivator中发生错误时,我们抛出异常。我们在ErrorChannel上得到的消息的有效负载为Spring 从ServiceActivator和筛选器引发异常的行为不同,spring,spring-integration,Spring,Spring Integration,在我们的应用程序中,我们有错误处理机制,我们在错误上抛出运行时异常。我注意到一种奇怪的行为,我想了解这种行为背后的机制 1) 情况1:ServiceActivator引发的异常转换为MessageHandlingException 当ServiceActivator中发生错误时,我们抛出异常。我们在ErrorChannel上得到的消息的有效负载为org.springframework.integration.MessageHandlingException,实际异常抛出为cause 2) 情况2
org.springframework.integration.MessageHandlingException
,实际异常抛出为cause
2) 情况2:筛选器引发的异常未使用MessageHandlingException屏蔽
当过滤器中发生错误,我们抛出异常时,负载就是实际的异常,并且不会被org.springframework.integration.MessageHandlingException
我有几个问题:
- 为什么ServiceActivator引发的异常行为与筛选器中的不同
- 在利用errorChannel和相关基础设施的同时,Spring集成项目中是否有一些关于错误处理的“最佳实践”
<int:channel
id="channelForFilesComingIn"
datatype="java.io.File"
>
<int:dispatcher task-executor="dispatchExecutor" />
</int:channel>
更新2:
我们要做的是从文件系统中读取文件并处理它们。在文件读取部分,使用带有CompositeFilter的file:inbound channel adapter
,该过滤器过滤未完全上载或不符合命名标准的文件
所有过滤器通过后,文件将移交给ServiceActivator进行处理
在上述任何情况下(过滤链或服务),如果出现错误情况,必须通过电子邮件向DB报告。为了实现这一点,我们抛出了ApplicationException,它被errorChannel捕获,并传递给专门的通道
为了说明这一点,当消息处理程序失败时,会抛出MessageHandlingException
(包装用户异常)-消息处理程序是处理消息的工具
如果在MessageSource
中引发异常,则没有消息,因此MessageHandlingException
(或任何messaginexception
)不适用
相反,轮询失败,异常被抛出回轮询器
如果要处理轮询端点中的异常(MessageSource
),则需要为轮询器提供一个ErrorHandlingTaskExecutor
,您可以向其提供一个ErrorHandler
,并对异常执行所需的操作,但由于还没有消息,它是由MessageSource
引发的原始异常
如果要将其发送到错误通道,则需要在自定义的
ErrorHandler
中执行此操作,您使用的是哪个版本的Spring Integration?我刚刚运行了一个测试,从过滤器中抛出了一个异常,并按预期收到了MessageHandlingException。请提供更多详细信息,包括配置。我使用的是2.1.4。我在调试会话中注意到了这种行为。我给这个问题附加了更多的细节。我以为你们是在谈论元素,考虑到你们是在比较它。文件列表筛选器用于MessageSource,它不是直接调用的组件。也许你可以分享更多关于你正试图做什么的信息。添加更多细节,不确定它们是否对你有帮助。让我知道谢谢Gary,当然有帮助!