Vert.x HttpClient中rxSend与send的差异及适用场景
Vert.x HttpClient:rxRequest/rxSend与request/send的差异及适用场景
你提到的两段代码从表面行为看确实一致,都会发起GET请求并处理响应体,但底层的执行时机和管控能力有本质区别,结合实际开发场景,选择逻辑如下:
核心差异回顾
rxRequest()/rxSend()返回冷Observable:仅在调用subscribe()时才会触发实际的网络请求,定义阶段只是构建执行链request()/send()内部调用rx*方法并立即订阅:代码执行到该方法时就会立刻发起请求,无需等待后续的subscribe()
两段对比代码
// 使用rxRequest/rxSend的版本 RecordParser parser = RecordParser.newDelimited("\n", h -> log.info("r={}", h.toString())); client .rxRequest(HttpMethod.GET, sut.actualPort(), "localhost", "/stream?file=stream2.txt") .flatMap(request -> request.rxSend().flatMap(HttpClientResponse::body)) .subscribe( body -> { parser.handle(body.getDelegate()); ctx.completeNow(); }, ctx::failNow); // vs 使用request/send的版本 RecordParser parser = RecordParser.newDelimited("\n", h -> log.info("r={}", h.toString())); client .request(HttpMethod.GET, sut.actualPort(), "localhost", "/stream?file=stream2.txt") .flatMap(request -> request.send().flatMap(HttpClientResponse::body)) .subscribe( body -> { parser.handle(body.getDelegate()); ctx.completeNow(); }, ctx::failNow);
何时使用rxRequest()/rxSend()
- 需要延迟执行请求:比如要等待用户交互事件、其他异步任务完成后再发起请求,可先构建Observable链,触发条件满足时再调用
subscribe() - 复用请求逻辑:将请求封装为Observable对象,在多个业务场景按需订阅,每次订阅都会发起新的独立请求
- 组合多异步操作:借助RxJava操作符(如
flatMap、zip、concat)实现并行请求、依赖请求等复杂异步流程,rx*方法能更好地融入RxJava的响应式体系 - 精细管控请求生命周期:需要随时取消请求(通过
Disposable)、添加错误重试、自定义线程调度等逻辑时,冷Observable的特性让你能在订阅前完成所有配置
何时使用request()/send()
- 简单即时请求:无需延迟执行、无需复杂异步组合的场景,用
request()/send()更简洁,省去手动管理订阅时机的代码 - 线性业务逻辑:在流程清晰的简单业务中,即时发起请求能让代码逻辑更直观,减少响应式API带来的额外理解成本
内容的提问来源于stack exchange,提问作者kodstark
相关产品推荐
相关产品推荐

