Spring Integration 错误通道标头在流程中被忽略

问题描述 投票:0回答:1

我正在尝试构建复杂的 Spring Integration 流程,其中部分流程需要处理错误场景并在流程中提供不同的分支,该分支将跳过一些处理并继续向下继续流程。

对于整个流程,我在传入网关上配置了一个错误通道,并且错误始终发送到该通道。当我在流程中间更改错误通道消息头时,它会被忽略,并且错误消息只会发送到网关错误通道。我相信这是因为它只是将异常沿着堆栈传播到网关,并且不检查消息标头。

所以在我看来,错误通道标头对于流程开发人员来说本质上是无用的,实际上只是用于内部 Spring Integration 框架的目的。

所以我的问题是,如果错误通道消息头没有执行您想要的操作,如何构建复杂的流,其中错误处理要求通过流进行更改(有时根据运行时配置数据或消息流数据动态配置)期望它在消息系统中发挥作用吗?

spring-integration spring-integration-dsl
1个回答
0
投票

对了,网关契约就是当异常抛回这个网关的时候,那边会处理一个错误。不过,这并没有设置到标题中。相反,图案的一部分是

return address
作为
TemporaryReplyChannel
ErrorMessage
可以发送到该标头,就像发送常规回复消息一样。下游流的异常会像常规 Java 程序一样抛出。

现在,如果您想在流程中间处理错误,那么您需要研究不同的机制。将其想象为 Java 中的

try..catch
。为此,Spring Integration 建议使用
ExpressionEvaluatingRequestHandlerAdvice
https://docs.spring.io/spring-integration/reference/handler-advice/classes.html#expression-advice

仅当您将流程工作转移到不同的线程时,自定义

errorChannel
标头才有意义,例如通过
ExecutorChannel
QueueChannel
。如果流程是直接的,则不会涉及任何错误通道,并且会像常规 Java 方法调用一样处理异常。因此,如果您在特定点没有
try..catch
异常,它将被冒泡回原始调用者。在您的情况下,其中一个是消息传递网关。这就是涉及网关上配置的错误通道的地方。

在夏天,你是对的:

errorChannel
在框架中的使用很有限,但是如果你编写常规的Java应用程序并且在中间有一些线程转移,那是完全相似的。如果不这样做,则异常会返回到被调用者。

© www.soinside.com 2019 - 2024. All rights reserved.