在通道中使用调度程序任务执行程序时,错误不会传播到我的错误处理程序

时间:2019-03-12 16:10:56

标签: spring-integration

下面是代码段,我正在尝试处理错误。

<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"/>

1 个答案:

答案 0 :(得分:0)

您的配置还不够完善,无法在我们这边使用,因此,如果您在GitHub上的某个地方有一个小项目,让我们可以重现问题,那将非常好。

但是,如果您想处理datasetInputChannelSA中的错误并且没有其他任何问题,则需要考虑为<request-handler-advice-chain>使用<service-activator>并包括一个ExpressionEvaluatingRequestHandlerAdvice,其trapExceptiontrue。您可以在此处配置failureChannel来捕获服务异常并在该通道的使用者中处理它们:https://docs.spring.io/spring-integration/docs/current/reference/html/#expression-advice

error-channel上下文中设置Executor标头已经为时已晚:失败的消息将不会查询下游标头。因此,您的错误将传播到上游网关调用填充的TemporaryReplyChannel标头中(虽然未在代码段中显示...)。