Java 如何使用Micronaut在HttpClientFilter中重试HTTP客户端请求?

Java 如何使用Micronaut在HttpClientFilter中重试HTTP客户端请求?,java,micronaut,micronaut-client,Java,Micronaut,Micronaut Client,我已经实现了一个micronautHttpClientFilter,为第三方服务的所有请求添加一个缓存的承载令牌,但是这个令牌会定期过期。我希望使用下游API重新验证,并在发生这种情况时重试请求,但似乎没有一种明显的方法可以做到这一点。到目前为止,我只是第二次调用继续,但是这会导致抛出索引越界错误(我认为这是应该抛出的异常,但Micronaut中似乎有一个bug)。我得到的最小减少量如下: import io.micronaut.http.HttpResponse; import io.micr

我已经实现了一个micronaut
HttpClientFilter
,为第三方服务的所有请求添加一个缓存的承载令牌,但是这个令牌会定期过期。我希望使用下游API重新验证,并在发生这种情况时重试请求,但似乎没有一种明显的方法可以做到这一点。到目前为止,我只是第二次调用
继续
,但是这会导致抛出
索引越界
错误(我认为这是应该抛出的异常,但Micronaut中似乎有一个bug)。我得到的最小减少量如下:

import io.micronaut.http.HttpResponse;
import io.micronaut.http.HttpStatus;
import io.micronaut.http.MutableHttpRequest;
import io.micronaut.http.annotation.Filter;
import io.micronaut.http.client.exceptions.HttpClientResponseException;
import io.micronaut.http.filter.ClientFilterChain;
import io.micronaut.http.filter.HttpClientFilter;
import io.reactivex.Flowable;

import javax.inject.Inject;

interface AuthTokenProvider {
    // cached
    Flowable<String> fetchToken();
    void invalidateToken();
}

@Filter(serviceId = "third-party-api")
public class AuthTokenFilter implements HttpClientFilter {
    @Inject AuthTokenProvider tokenProvider;

    private Flowable<HttpResponse<?>> buildRequestWithToken(MutableHttpRequest<?> request, ClientFilterChain chain) {
        return tokenProvider.fetchToken()
                .map(token -> request.bearerAuth(token))
                .flatMap(chain::proceed);
    }

    @Override
    public Flowable<HttpResponse<?>> doFilter(MutableHttpRequest<?> request, ClientFilterChain chain) {
        return buildRequestWithToken(request, chain)
                .onErrorResumeNext(err -> {
                    System.out.println("API request failed, invalidating token and retrying");

                    tokenProvider.invalidateToken();
                    return buildRequestWithToken(request, chain);
                });
    }
}
import io.micronaut.http.HttpResponse;
导入io.micronaut.http.HttpStatus;
导入io.micronaut.http.MutableHttpRequest;
导入io.micronaut.http.annotation.Filter;
导入io.micronaut.http.client.exceptions.HttpClientResponseException;
导入io.micronaut.http.filter.ClientFilterChain;
导入io.micronaut.http.filter.HttpClientFilter;
导入io.reactivex.Flowable;
导入javax.inject.inject;
接口身份验证令牌提供程序{
//缓存
可流动的fetchToken();
void invalidateToken();
}
@过滤器(serviceId=“第三方api”)
公共类AuthTokenFilter实现HttpClientFilter{
@注入AuthTokenProvider tokenProvider;
private Flowable>doFilter(可变HttpRequest请求,客户端筛选器链){
返回buildRequestWithToken(请求,链)
.onErrorResumeNext(错误->{
System.out.println(“API请求失败,使令牌无效并重试”);
tokenProvider.invalidateToken();
返回buildRequestWithToken(请求,链);
});
}
}
有人能建议正确的方法吗

  • 您可以在application.yml中使用advanced expiration属性,如果将其设置为200secs,则micronaut会认为令牌在实际到期时间之前200sec已过期
  • 您可以使用micronaut在第18页中提供的重试注释
  • 您可以在application.yml中使用advanced expiration属性,如果将其设置为200secs,则micronaut会认为令牌在实际到期时间之前200sec已过期
  • 您可以使用micronaut在第18页中提供的重试注释

  • ATM通过过滤器似乎无法重试如果您使用声明式客户端(如果您可能),他们提供了一个带重试选项的断路器,请查看7.3.6“重试和断路器”下的文档。ATM通过过滤器似乎无法重试如果您使用声明式客户端(如果您可能)他们提供带重试选项的断路器,请查看7.3.6重试和断路器下的文档。