首页 文章

spring 集成中的错误处理/传播

提问于
浏览
2

我已经读过,如果在流中抛出异常,框架将要做的第一件事就是检查错误通道属性的消息头 . 总是这样吗?

在我的特定情况下,我正在为消息头分配一个自定义错误通道,但消息似乎从流传播到最近的错误处理程序/错误通道 .

<int:chain id="buildAggregatedResponseChain" input-channel="aggregatedResultChannel"
               output-channel="sendAggregatedChannel">
        <int:header-enricher>
            <int:error-channel ref="myErrorChannel"/>
        </int:header-enricher>
        <int:service-activator ref="service" method="doSomething"/>
    </int:chain>

我在doSomething中明确抛出异常,但异常永远不会在myErrorChannel中结束 . 相反,它会“传播”到流上最近的ErrorHandler或者为int-mail指定的错误通道:imap-idle-channel-adapter(尝试了几个不同的流) . 我错过了什么?也许有人可以概述错误处理/错误传播的主要原则(例如,当谈论几个交易等)?有一些信息,但它是分散的,而不是系统的 .

1 回答

  • 2

    这取决于上游流量;如果有异步切换,则查询头部;否则,异常将被抛回到入站 endpoints .

    一般来说,我建议不要修改 errorChannel 等框架 Headers . 而是在入站 endpoints (例如您的imap空闲适配器)上放置 error-channel 并处理该流上的错误 .

    很少需要直接修改 Headers . 如果您希望插入不同的错误处理中间流,那么您可以插入消息传递网关...

    <int:service activator ... ref="gw" />
    
    <int:gateway id="gw" default-request-channel="..." 
        error-channel="midFlowErrorChannel" />
    

    如果下游流(来自网关)在成功时未返回结果,则确保添加默认回复超时0(或使用带有返回void的方法的自定义服务接口) .

相关问题