Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 从ServiceActivator和筛选器引发异常的行为不同_Spring_Spring Integration - Fatal编程技术网

Spring 从ServiceActivator和筛选器引发异常的行为不同

Spring 从ServiceActivator和筛选器引发异常的行为不同,spring,spring-integration,Spring,Spring Integration,在我们的应用程序中,我们有错误处理机制,我们在错误上抛出运行时异常。我注意到一种奇怪的行为,我想了解这种行为背后的机制 1) 情况1:ServiceActivator引发的异常转换为MessageHandlingException 当ServiceActivator中发生错误时,我们抛出异常。我们在ErrorChannel上得到的消息的有效负载为org.springframework.integration.MessageHandlingException,实际异常抛出为cause 2) 情况2

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

1) 情况1:ServiceActivator引发的异常转换为MessageHandlingException

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

2) 情况2:筛选器引发的异常未使用MessageHandlingException屏蔽

当过滤器中发生错误,我们抛出异常时,负载就是实际的异常,并且不会被
org.springframework.integration.MessageHandlingException

我有几个问题:

  • 为什么ServiceActivator引发的异常行为与筛选器中的不同
  • 在利用errorChannel和相关基础设施的同时,Spring集成项目中是否有一些关于错误处理的“最佳实践”
更新1:

Filter扩展了AbstractFileListFilter,它是过滤器链的一部分,是实现FileListFilter的自定义CompositeFilter

文件:入站通道适配器正在使用CompositeFileFilter,该适配器将输出传递到下面声明的通道:

<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,当然有帮助!