下面是代码段,我正在尝试处理错误。
<int:channel id="errorGateWayChannel"></int:channel>
<int:service-activator ref="errorHandler"
input-channel="errorGateWayChannel" />
...
<int:service-activator.. />
<int-http:outbound-gateway ..>
<int:channel id="routerInputChannel">
<int:dispatcher task-executor="sharedPool"/></int:channel>
<int:header-enricher input-channel="routerInputChannel" output-channel="routerInputChannel1">
<int:error-channel ref="errorGateWayChannel"/>
</int:header-enricher>
<int:recipient-list-router input-channel="routerInputChannel1"
default-output-channel="nullChannel">
<int:recipient channel="datasetInputChannel"/>
</int:recipient-list-router>
<int:service-activator id="datasetInputChannelSA" input-channel="datasetInputChannel"/> <!-- now this service activator giving me error -->
现在,如果“ datasetInputChannelSA”服务激活器抛出任何异常,我将得到警告,并且不会传播到错误通道。
WARN org.springframework.messaging.core.GenericMessagingTemplate $ TemporaryReplyChannel-已收到回复消息,但接收线程已收到回复:ErrorMessage [payload = org.springframework.messaging.MessageHandlingException:嵌套异常为java.lang.RuntimeException:
我可以看到类似的线程正在警告,但找不到如何处理它。
更新: 在“ int:error-channel”中提供overwrite =“ true”后,它可以正常工作并解决我的问题。
<int:error-channel ref="errorGateWayChannel"/>
to
<int:error-channel ref="errorGateWayChannel" overwrite="true"/>
答案 0 :(得分:0)
您的配置还不够完善,无法在我们这边使用,因此,如果您在GitHub上的某个地方有一个小项目,让我们可以重现问题,那将非常好。
但是,如果您想处理datasetInputChannelSA
中的错误并且没有其他任何问题,则需要考虑为<request-handler-advice-chain>
使用<service-activator>
并包括一个ExpressionEvaluatingRequestHandlerAdvice
,其trapException
为true
。您可以在此处配置failureChannel
来捕获服务异常并在该通道的使用者中处理它们:https://docs.spring.io/spring-integration/docs/current/reference/html/#expression-advice
在error-channel
上下文中设置Executor
标头已经为时已晚:失败的消息将不会查询下游标头。因此,您的错误将传播到上游网关调用填充的TemporaryReplyChannel
标头中(虽然未在代码段中显示...)。