0

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

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-adapterCompositeFilter 过滤未完全上传或不符合命名标准的文件。

在所有过滤器都通过后,将文件移交给 ServiceActivator 进行处理

在上述任何一个(过滤器链或服务)中,如果出现错误情况,则必须将其报告给数据库并通过电子邮件报告。为了实现这一点,我们抛出了由 errorChannel 捕获的 ApplicationException,并传递给专门的通道。

4

1 回答 1

0

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

如果在 中引发异常MessageSource,则还没有消息,因此 a MessageHandlingException(或 any MessagingException)不适用。

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

如果要处理轮询MessageSource端点(由.ErrorHandlingTaskExecutorErrorHandlerMessageSource

如果要将其发送到错误通道,则需要在 custom 中执行此操作ErrorHandler

于 2013-01-09T23:59:04.673 回答