【问题标题】:Global erroChannel service activator not invoked未调用全局 erroChannel 服务激活器
【发布时间】:2015-05-27 09:34:02
【问题描述】:

我已经为全局 errorChannel 编写了一个服务激活器。

<!-- global default exception handler--> 
<int:service-activator input-channel="errorChannel" 
      auto-startup="true" ref="defaultExeptionHandler" >
</int:service-activator>

测试类

@Test
public void testTradeAcceptanceFlow() throws Exception {
    throw new FileNotFoundException();
}

由于我明确抛出错误,我希望这会在全局错误通道中被捕获,并反过来调用我的处理程序,但它没有这样做。知道为什么吗?

【问题讨论】:

    标签: spring integration


    【解决方案1】:

    如果您的流程中有一些异步切换,则会将异常包装到 ErrorMessage 并发送到全局(默认)errorChannel

    请在Reference Manual 中查看更多信息。

    有个说明:

    这里要理解的最重要的一点是,基于消息传递的错误处理仅适用于在 TaskExecutor 中执行的 Spring Integration 任务引发的异常。这不适用于与发送者在同一线程中运行的处理程序抛出的异常(例如,通过上述 DirectChannel)。

    许多人在 Spring 集成中缺少这种标准的 Java try...catch 行为,并尝试用 errorCnannel 来处理所有事情。

    关于您的测试方法。这完全没有意义,也没有处理任何 Spring Integration 的东西。

    【讨论】:

    • 感谢 artem,已解决此问题。不过对此有疑问,我有一个带有错误通道的文件输入适配器,并且在处理其中一个文件时出现异常。此异常已正确导航到我的错误通道。但是我的其他文件没有被这个文件输入通道读取。当处理一个文件出错时,输入适配器是否停止读取下一个文件?
    • 通常没有。需要查看您的配置并了解环境。也许您有一些自定义的FileListFilter,它可以防止进一步的目录轮询,或者您确定该异常为严重异常并停止您的应用程序或该适配器等等。
    • 感谢 Artem 的帮助。一个持续的问题,如果异常被抛出并在服务激活器中,我想要一个逻辑来说明某些类型的异常重播消息。例如,如果由于数据库关闭或此类原因而出现错误,则异常将进入错误通道,我想重播该消息“n”次。请问如何实现?
    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2018-10-30
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多