如何将Micronaut默认响应式declarative http client改为阻塞式?
如何将Micronaut声明式HTTP客户端改为阻塞式?
当然可以,有几种简洁的方式实现:
使用
@Blocking注解(推荐)
直接在声明式客户端的接口或方法上添加@io.micronaut.http.client.annotation.Blocking注解,就能让方法以阻塞模式执行,无需返回响应式类型(比如Publisher、CompletableFuture),直接返回具体的响应实体:import io.micronaut.http.annotation.Get; import io.micronaut.http.client.annotation.Blocking; import io.micronaut.http.client.annotation.Client; @Client("/api") @Blocking public interface BlockingUserClient { @Get("/users/{userId}") User fetchUser(Long userId); }添加注解后,Micronaut会自动处理底层的阻塞逻辑,你直接调用方法就能同步拿到结果。
手动阻塞响应式调用
如果不想修改客户端定义,也可以在调用响应式客户端时手动阻塞获取结果:// 原响应式客户端 @Client("/api") public interface ReactiveUserClient { @Get("/users/{userId}") Mono<User> fetchUser(Long userId); } // 调用时阻塞获取结果 User targetUser = reactiveUserClient.fetchUser(100L).block();注意:避免在Netty事件循环线程中调用阻塞方法,建议在专门的阻塞线程池执行这类操作,防止影响性能。
使用原生阻塞HTTP客户端
若完全不想依赖响应式基础,也可以直接使用Micronaut提供的阻塞式HttpClient实现,不过声明式客户端加@Blocking的方案更符合声明式编程的简洁性。
内容的提问来源于stack exchange,提问作者demon101
相关产品推荐
相关产品推荐

