我可以使Spring的@Retryable或@RetryTemplate使用HTTP Retry-After
“服务不可用”响应中的503
标头中接收的数字作为下一次重试迭代的延迟吗?
例如:
@Retryable(maxAttempts = 42,
backoff = @Backoff(delay = 1000),
value = NotYetReady.class)
public boolean isExternalComponentReadyToUse() throws NotYetReady {
ResponseEntity<String> response = callRestEndpointToCheckReadiness();
if (!response.getStatus().is2xxSuccessful()) {
int retryAfterInSeconds = response.getHeaders().get("Retry-After");
// tell @Retryable to run next attempt after retryAfterInSeconds?
throw new NotYetReady();
}
return true;
}
我们的Java应用程序依赖一个外部组件,该组件需要花费几分钟的时间。该组件提供了一个REST端点来检查准备情况。如果端点可以估计剩余的设置将花费多长时间,则端点发送带有503
头的Retry-After
。
答案 0 :(得分:2)
一种方法是将值存储在静态ThreadLocal
中(例如MyHolder.setDelay(...)
),然后在delayExpression
中使用@Backoff()
来检索该值。 / strike>
类似 "T(com.foo.MyHolder).getDelay()"
。
您需要使用自定义RetryOperationsInterceptor
将@Bean
作为BackoffPolicy
连接起来,并在@Retryable.interceptor
属性中引用它。