我有在流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不同的东西吗?如果是这样,那应该是什么?
根据定义,Webflux是异步的,这意味着Mono(请求)在请求完成/失败时异步满足,而不是在调用线程上。因此,建议将无济于事,因为请求的“发送”部分总是成功的。
Mono
您将必须通过错误通道上的流(在流的开始附近分配)进行重试。也许带有一些标头,指示您重试了多少次。
在ErrorMessage具有属性failedMessage和cause; 您可以重新发送failedMessage。
ErrorMessage
failedMessage
cause
您可以关闭异步,以便调用线程被阻止,但这确实违反了使用WebFlux的全部目的。