Spring集成中如何重试对Webflux.outboundgateway的失败调用

时间:2018-06-21 14:54:23

标签: spring-boot spring-integration spring-integration-dsl

我有一个用流DSL语法定义的spring集成流。我的处理程序之一是Webflux.outboundGateway。当无法访问远程URI时,将引发异常并将其发送到“ errorChannel”。我正在尝试重试流程,但到目前为止没有成功(永远不会重试该呼叫)。这是我的配置:

@Bean
public IntegrationFlow retriableFlow() {
    return IntegrationFlows
            .from(...)
            .handle(
                    WebFlux.outboundGateway(m ->
                        UriComponentsBuilder.fromUriString(remoteGateway + "/foo/bar")
                                            .build()
                                            .toUri(), webClient)
                    .httpMethod(HttpMethod.POST)
                    .expectedResponseType(String.class)
                    .replyPayloadToFlux(true), e -> e.advice(retryAdvice())
            )
            // [ ... ]
            .get();
}
@Bean
public Advice retryAdvice() {
   RequestHandlerRetryAdvice advice = new RequestHandlerRetryAdvice();
   RetryTemplate retryTemplate = new RetryTemplate();
   ExponentialBackOffPolicy retryPolicy = new ExponentialBackOffPolicy();
   retryPolicy.setInitialInterval(1000);
   retryPolicy.setMaxInterval(20000);
   retryTemplate.setBackOffPolicy(retryPolicy);
   advice.setRetryTemplate(retryTemplate);
   return advice;
}

我应该使用与RequestHandlerRetryAdvice不同的东西吗?如果是这样,那应该是什么?

1 个答案:

答案 0 :(得分:1)

根据定义,Webflux是异步的,这意味着Mono(回复)在请求完成/失败时异步满足,而不是在调用线程上。因此,建议将无济于事,因为请求的“发送”部分总是成功的。

您将必须通过错误通道上的流(在流的开始附近分配)进行重试。也许有一些标头指示您重试了多少次。

ErrorMessage具有属性failedMessagecause;您可以重新发送failedMessage

您可以关闭异步功能,以便调用线程阻塞,但这确实违反了使用WebFlux的全部目的。