Sok*_*lov 5 java project-reactor spring-webflux
我正在使用 Spring 5 反应式堆栈中的 WebFlux HTTP 客户端来访问外部 REST 服务。我想根据 HTTP 状态处理响应:
如果状态为 2xx,我想返回Mono反序列化的响应正文。
如果状态为 404 我想删除响应正文并立即返回 empty Mono。
对于任何其他状态,我想删除响应正文并返回错误 Mono with MyBusinessException.
我的代码如下所示:
webClient.get()
.uri("/search")
.syncBody(request)
.exchange()
.flatMap { response ->
when {
response.statusCode().is2xxSuccessful -> response.bodyToMono(MyResponse::class.java)
response.statusCode() == NOT_FOUND -> Mono.empty()
else -> MyBusinessException().toMono<MyResponse>()
}
}
Run Code Online (Sandbox Code Playgroud)
当我不需要时,我不想浪费时间来接收和处理响应正文。exchange()方法状态的 JavaDoc
您必须始终使用响应的主体或实体方法之一以确保释放资源。
如果我想耗尽响应主体并立即返回结果,我到底应该怎么做?
需要清空响应,以便连接可以重用于将来的请求(即 http 保持活动/持久连接)。
Mono要返回在主体耗尽后完成的空(忽略错误):
// Using WebFlux >= 5.2
response.releaseBody()
// ignore errors
.onErrorResume(exception -> Mono.empty());
// Using WebFlux < 5.2
response.body(BodyExtractors.toDataBuffers())
// release DataBuffers
.doOnNext(DataBufferUtils::release)
// ignore errors
.onErrorResume(exception -> Mono.empty())
// return an empty Mono
.then();
Run Code Online (Sandbox Code Playgroud)
要返回立即完成的空值Mono,并在后台异步排出主体(忽略错误):
// Using WebFlux >= 5.2
Mono.<Void>empty()
.doOnSubscribe(s ->
// drain the body
response.releaseBody()
// initiate drain on a separate Scheduler
.subscribeOn(Schedulers.parallel())
// subscribe, and ignore errors
.subscribe())
// Using WebFlux < 5.2
Mono.<Void>empty()
.doOnSubscribe(s ->
// drain the body
response.body(BodyExtractors.toDataBuffers())
// release DataBuffers
.doOnNext(DataBufferUtils::release)
// initiate drain on a separate Scheduler
.subscribeOn(Schedulers.parallel())
// subscribe, and ignore errors
.subscribe())
Run Code Online (Sandbox Code Playgroud)
我仍然推荐第一个选项,因为它可以立即释放资源,并且可能是开发WebClient人员在编写它并记录其用法时所想到的。
我从未在生产系统中使用过第二个选项,因此请自行测试以确保 http 连接池的行为符合预期。如果使用reactor-netty,您可以启用调试日志记录reactor.netty.resources.PooledConnectionProvider来比较这两种方法。
| 归档时间: |
|
| 查看次数: |
5316 次 |
| 最近记录: |