OidcClientRequestReactiveFilter的容错重试功能失效问题咨询
RestClient注解@Retry/@Timeout不生效的原因及说明
这是特性,不是Bug
你遇到的情况是Quarkus当前版本中RestClient与SmallRye Fault Tolerance整合的特性限制,核心原因在于:
- 你的接口方法返回的是同步类型
String,但搭配了基于Reactive栈的OidcClientRequestReactiveFilter。Quarkus会自动把同步方法包装成Reactive调用(底层用Uni),但SmallRye的容错注解(@Retry、@Timeout)没法在这种自动包装的同步方法上正确拦截生效。 - 只有当RestClient方法直接返回Reactive类型(比如
Uni<String>)时,这些注解才能和Reactive调用链正确整合,触发重试、超时逻辑,同时输出你配置的DEBUG日志。
解决办法
把接口方法的返回类型改成Uni<String>即可,示例代码:
@RegisterRestClient(configKey = "acs") @RegisterProvider(OidcClientRequestReactiveFilter.class) public interface Test { @GET @Timeout @Retry @Path("/some-cool_path") Uni<String> test(); }
为什么手动用Uni实现重试可行?
你手动通过Uni的重试API(比如uni.retry().atMost(3))能生效,是因为直接在Reactive调用链上操作,绕开了RestClient同步方法自动包装带来的注解拦截问题,自然能正常工作。
内容的提问来源于stack exchange,提问作者Irina
相关产品推荐
相关产品推荐

