Spring integration Spring集成Webflux异常处理

Spring integration Spring集成Webflux异常处理,spring-integration,spring-integration-dsl,Spring Integration,Spring Integration Dsl,如果spring integration webflux流中发生异常,则异常本身(带有stacktrace)将通过MessagePublishingErrorHandler作为有效负载发送回调用方,MessagePublishingErrorHandler使用来自“errorChannel”头的错误通道,而不是默认错误通道 如何设置类似的错误处理程序?我想生成一个Http状态码,可能还有一个DefaultErrorAttributes对象作为响应 简单地定义一个从errorChannel开始的流

如果spring integration webflux流中发生异常,则异常本身(带有stacktrace)将通过MessagePublishingErrorHandler作为有效负载发送回调用方,MessagePublishingErrorHandler使用来自“errorChannel”头的错误通道,而不是默认错误通道

如何设置类似的错误处理程序?我想生成一个Http状态码,可能还有一个
DefaultErrorAttributes
对象作为响应

简单地定义一个从
errorChannel
开始的流是不起作用的,错误消息不会在那里结束。我试图定义自己的
fluxErrorChannel
,但它似乎也没有用作错误通道,错误不会在我的
错误流中结束:

@Bean
public IntegrationFlow fooRestFlow() {
    return IntegrationFlows.from(
            WebFlux.inboundGateway("/foo")
                    .requestMapping(r -> r.methods(HttpMethod.POST))
                    .requestPayloadType(Map.class)
                    .errorChannel(fluxErrorChannel()))
            .channel(bazFlow().getInputChannel())
            .get();
}

@Bean
public MessageChannel fluxErrorChannel() {
    return MessageChannels.flux().get();
}

@Bean
public IntegrationFlow errorFlow() {
    return IntegrationFlows.from(fluxErrorChannel())
            .transform(source -> source)
            .enrichHeaders(h -> h.header(HttpHeaders.STATUS_CODE, HttpStatus.BAD_GATEWAY))
            .get();
}

@Bean
public IntegrationFlow bazFlow() {
    return f -> f.split(Map.class, map -> map.get("items"))
            .channel(MessageChannels.flux())
            .<String>handle((p, h) -> throw new RuntimeException())
            .aggregate();
}
错误通道最终被重置为
Mono.fromFuture
中的
原始错误通道hannelhandler
,但在我的例子中,该错误通道为空。此外,永远不会调用
onErrorResume
lambda:

return Mono.fromFuture(replyChannel.messageFuture)
    .doOnSubscribe(s -> {
        if (!error && this.countsEnabled) {
            this.messageCount.incrementAndGet();
        }
    })
    .<Message<?>>map(replyMessage ->
        MessageBuilder.fromMessage(replyMessage)
            .setHeader(MessageHeaders.REPLY_CHANNEL, originalReplyChannelHeader)
            .setHeader(MessageHeaders.ERROR_CHANNEL, originalErrorChannelHeader)
            .build())
    .onErrorResume(t -> error ? Mono.error(t) : handleSendError(requestMessage, t));
返回Mono.fromFuture(replyChannel.messageFuture)
.doOnSubscribe(s->{
如果(!error&&this.countsEnabled){
this.messageCount.incrementAndGet();
}
})

这是一只虫子;错误处理程序为异常创建的
ErrorMessage
被发送到
errorChannel
头(它必须是
replyChannel
,以便网关获得结果)。然后,网关应该调用错误流(如果存在)并返回该错误流的结果


参考的相关部分:在参考WebFlux的错误处理部分,没有提到错误-它们与同步/异步不同吗?很好:o)感谢您对此进行研究。5.0.9应该在周一发布。
return Mono.fromFuture(replyChannel.messageFuture)
    .doOnSubscribe(s -> {
        if (!error && this.countsEnabled) {
            this.messageCount.incrementAndGet();
        }
    })
    .<Message<?>>map(replyMessage ->
        MessageBuilder.fromMessage(replyMessage)
            .setHeader(MessageHeaders.REPLY_CHANNEL, originalReplyChannelHeader)
            .setHeader(MessageHeaders.ERROR_CHANNEL, originalErrorChannelHeader)
            .build())
    .onErrorResume(t -> error ? Mono.error(t) : handleSendError(requestMessage, t));