从ServiceActivator到Filter的抛出异常表现不同

时间:2013-01-09 19:16:40

标签: spring spring-integration

在我们的应用程序中,我们有错误处理机制,我们在错误上抛出运行时异常。我注意到一个奇怪的行为,我想了解这个基础的机制

1)情况1:从ServiceActivator抛出的异常被转换为MessageHandlingException

当ServiceActivator发生错误时,我们抛出异常。我们在ErrorChannel上收到的消息的PayLoad为org.springframework.integration.MessageHandlingException,实际异常抛出为 cause

2)情况2:使用MessageHandlingException

不屏蔽Filter抛出的异常

当Filter中发生错误,并且我们抛出异常时,PayLoad是实际异常,并且不会被org.springframework.integration.MessageHandlingException

屏蔽

我有几个问题:

  • 为什么ServiceActivator的异常抛出与Filter
  • 的行为不同
  • 在使用errorChannel和相关基础架构时,Spring集成项目中是否有一些关于错误处理的“最佳实践”

更新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,并传递给专门的通道。

1 个答案:

答案 0 :(得分:0)

为了说清楚,当Message HANDLER失败时抛出MessageHandlingException(包装用户异常) - 消息处理程序是处理消息的东西。

如果MessageSource中出现异常,则表示尚无消息,因此MessageHandlingException(或任何MessagingException)不适用。

相反,轮询失败,异常被抛回轮询器。

如果要处理轮询端点(MessageSource)中的异常,则需要向轮询器ErrorHandlingTaskExecutor提供ErrorHandler,并为此提供MessageSource并执行您想要的操作除了例外,但由于还没有消息,它是ErrorHandler抛出的原始异常。

如果您想将其发送到错误频道,则需要在自定义{{1}}中执行此操作。