【问题标题】:Spring Integration WebFlux Error HandlingSpring 集成 WebFlux 错误处理
【发布时间】:2018-07-05 06:37:02
【问题描述】:

SI 5+ 支持WebFlux,这意味着我们现在可以构建一个反应式消息传递系统。然而,这也意味着设计已经经过深思熟虑,通常的错误处理方法不起作用。在响应式流中,消息是Publisher(Flux),它不会引发异常,但会发出错误通知。因此,消息上设置的错误通道标头是无用的,因为 SI 不知道Flux 导致了错误。 考虑以下代码:

.handle(WebFlux.outboundGateway(m -> m.getPayload().toString(), webClient)
    .expectedResponseType(YelpRecord.class)
    .httpMethod(GET)
    .mappedRequestHeaders(ACCEPT)
    .replyPayloadToFlux(true))
.handle((GenericHandler<Flux<YelpRecord>>) (flux, headers) ->
    flux
            .doOnError(t -> log.error(t.getMessage(), t))
            .doAfterTerminate(() ->
                    log.info("Completed streaming from: {}.", headers.get(DOWNLOAD_URI_HEADER))
            )
            .onBackpressureBuffer(
                    yelpArtifactoryProperties.getOnBackpressureBufferSize(),
                    BufferOverflowStrategy.ERROR)
)

上面的代码 sn-p 中缺少的是将异常发送到在来自doOnError 的消息上配置的错误通道。我们该怎么做?

【问题讨论】:

    标签: spring spring-integration reactive-programming spring-webflux


    【解决方案1】:

    ((MessageChannel) header.getErrorChannel()).send(...).doOnError() 中为您工作吗?

    关键是你是对的,消息负载中的这个Flux 已经不受框架的控制,如果你想处理它的错误,你必须自己做。那已经是您的代码,带有doOnError(),因此框架无法自动帮助您。

    【讨论】:

    • ErrorMessagePublisher 我也觉得很有趣?
    • 是的,那么MessagePublishingErrorHandler 会更好。这个也可以从标题中解析errorChannel,不仅要坚持使用预先配置的,就像它的超级一样。
    • 那么,自动连接MessagePublishingErrorHandler 并致电handleError
    • 听起来像! .doOnError(errorPublisher::handleError) 就是这样!但仍然需要记住,如果出现此类错误,整个Flux 将终止。只有一个事件出错时,您无法继续处理:projectreactor.io/docs/core/release/reference/#error.handling
    • 有了reactor 3.2,我们可以!见this
    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2019-12-04
    • 2015-05-24
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多