如何使用自定义错误通道和 WebFlux.inboundGateway 来回复错误响应?
How to use custom error channel and WebFlux.inboundGateway to reply with an error response?
按照下面的两个链接,我创建了一个 IntegrationFlow,它在出现错误时调用自定义 errorFlow。然而,我看到的行为是应用程序从不回复客户端,它只是挂起。如何回复来自 errorFlow 的请求?作为参考,我托管了我的样本 on github.
@Bean
public IntegrationFlow mainFlow() {
return IntegrationFlows.from(WebFlux.inboundGateway(URI)
.errorChannel(customErrorChannel()))
.channel(MessageChannels.flux()) //Work around: https://github.com/spring-projects/spring-integration/issues/3276
.transform(p -> {
throw new RuntimeException("Error!");
//return "Ok Response"; //If we comment the throw and uncomment this, then the the code replies to the request ok.
})
.get();
}
@Bean
public PublishSubscribeChannel customErrorChannel() {
return MessageChannels.publishSubscribe().get();
}
@Bean
public IntegrationFlow errorFlow() {
return IntegrationFlows.from("customErrorChannel")
.transform(p -> {
return "Error Response";
})
.get();
}
请求...
GET http://localhost:8080/foo
原来这个逻辑还是有问题。
我们需要进一步调查并找出解决方法。
与此同时,您可以使用 ExpressionEvaluatingRequestHandlerAdvice
对发生故障的变压器使用变通方法,并在 errorFlow()
中以类似的方式处理错误。将 returnFailureExpressionResult
视为 true
。而您的 onFailureExpression
应该是对 customErrorChannel
的网关调用。或者您可以使用该表达式中的 MessagingTemplate.sendAndReceive()
API 而不是网关。
按照下面的两个链接,我创建了一个 IntegrationFlow,它在出现错误时调用自定义 errorFlow。然而,我看到的行为是应用程序从不回复客户端,它只是挂起。如何回复来自 errorFlow 的请求?作为参考,我托管了我的样本 on github.
@Bean
public IntegrationFlow mainFlow() {
return IntegrationFlows.from(WebFlux.inboundGateway(URI)
.errorChannel(customErrorChannel()))
.channel(MessageChannels.flux()) //Work around: https://github.com/spring-projects/spring-integration/issues/3276
.transform(p -> {
throw new RuntimeException("Error!");
//return "Ok Response"; //If we comment the throw and uncomment this, then the the code replies to the request ok.
})
.get();
}
@Bean
public PublishSubscribeChannel customErrorChannel() {
return MessageChannels.publishSubscribe().get();
}
@Bean
public IntegrationFlow errorFlow() {
return IntegrationFlows.from("customErrorChannel")
.transform(p -> {
return "Error Response";
})
.get();
}
请求...
GET http://localhost:8080/foo
原来这个逻辑还是有问题。
我们需要进一步调查并找出解决方法。
与此同时,您可以使用 ExpressionEvaluatingRequestHandlerAdvice
对发生故障的变压器使用变通方法,并在 errorFlow()
中以类似的方式处理错误。将 returnFailureExpressionResult
视为 true
。而您的 onFailureExpression
应该是对 customErrorChannel
的网关调用。或者您可以使用该表达式中的 MessagingTemplate.sendAndReceive()
API 而不是网关。