【问题标题】:Throwing exception from ServiceActivator vs. Filter behaves differently从 ServiceActivator 与 Filter 抛出异常的行为不同
【发布时间】:2013-01-09 19:16:39
【问题描述】:

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

1) 情况一:ServiceActivator抛出的异常转化为MessageHandlingException

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

2) 情况 2:Filter 抛出的异常没有被 MessageHandlingException 屏蔽

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

我有几个问题:

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

更新 1:

Filter 扩展了作为过滤器链一部分的 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,并传递给专门的通道。

【问题讨论】:

  • 您使用的是什么版本的 Spring Integration?我刚刚运行了一个测试,从过滤器中抛出了一个异常,并按预期收到了 MessageHandlingException。请提供更多详细信息,包括配置。
  • 我使用的是 2.1.4。我在调试会话中注意到了这种行为。我正在为问题附上更多细节。
  • 我以为您在谈论 元素,考虑到您将它与 进行比较。文件列表过滤器在 MessageSource 中使用,它不是直接调用的组件。也许您可以分享更多关于您正在尝试做什么的信息。
  • 添加了更多详细信息,不确定它们是否对您有所帮助。告诉我

标签: spring spring-integration


【解决方案1】:

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

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

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

如果您想在轮询端点 (MessageSource) 中处理异常,您需要为轮询器提供一个 ErrorHandlingTaskExecutor,您可以向其提供一个 ErrorHandler 并对异常执行您想要的操作,但是由于还没有消息,原来是MessageSource抛出的异常。

如果您想将其发送到错误通道,您需要在您的自定义 ErrorHandler 中执行此操作。

【讨论】:

  • 谢谢加里,当然有帮助!
猜你喜欢
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
相关资源
最近更新 更多