java - 如何使用 Reactor 处理来自 API 的大型 JSON 响应?

标签 java reactive-programming project-reactor

API 响应一个 JSON 对象,它有一个对象数组,比如 {"items":[{...},{...},...], ... 我们需要处理的数据。问题是数组有 + 1.000 个对象,端点响应很慢,所以流式传输需要很多秒才能完成,而我们使用 Apache HttpClient 的“bloking”编程模型 消耗端点和 Jackson 序列化响应,我们等待获取完整主体来解析包含数组的所有对象,而不是在每个元素到来时处理它,节省时间内存使用,因为一旦处理了一个元素,我们就可以让 GC 释放该元素使用的内存。

当数据到来时,我如何使用 Reactor 项目 响应?更改我们正在使用的 HTTP 客户端和/或序列化程序没有问题。此外,我们将 Java 8 与 Spring MVC 和 Spring 4.3 一起使用,但我们可以将该项目移至即将发布的 Spring 版本。

注意:端点是一个第三方 API,一个简单的 GET 到 HTTP 1.1 服务器,我们不能改变它的工作方式,比如添加分页或类似的东西。

最佳答案

即将推出的 Spring Web Reactive 框架支持此用例,目前在 Spring Framework 5.0 M3 中可用并在选择 Spring Boot 2.0 + Web Reactive 依赖项时通过 start.spring.io。

当您使用 Flux 时输入参数或返回值,处理的每一步都是异步和非阻塞的,Jackson 用于序列化每个单独的元素,以允许您序列化/反序列化大的和可能有限的元素流。在这种情况下,Spring 将负责识别数组中的单个 JSON 元素以进行反序列化或添加 []用于序列化的 JSON 数组。这也允许使用 JSON 流,例如 Twitter JSON API。

请注意,一旦 Jackson 支持异步非阻塞处理,我们将更新 Spring Framework 5 编解码器以在本地使用它。

关于java - 如何使用 Reactor 处理来自 API 的大型 JSON 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40594174/

相关文章:

java - 在android中扩展ArrayAdapter

java - 自动授予 ACTION_MANAGE_OVERLAY_PERMISSION

ios - 使用 RxSwift 在 x 秒后显示事件指示器

r - 自从添加了 eventReactive 和 observeEvent 之后,Isolate 就不再起作用了吗?

kotlin - Reactor Flux<MyObject> 到 Mono<List<MyObject>>

java - 删除按钮功能

java - JOptionPane Swing

objective-c - 何时使用 RACReplaySubject 与 RACMulticastConnection?

spring-webflux - Spring 2.0 WebFlux : Merge multiple Mono<String> , 其中 string 是转换为 string 的 json,转换为单个 Flux<String>

spring-data-jpa - Spring Webflux (Reactor) Scheduler 在出错后不会终止