3

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

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

注意:端点是第三方 API,是对 HTTP 1.1 服务器的简单 GET,我们无法更改它的工作方式,例如添加分页或类似的东西。

4

1 回答 1

2

即将推出的 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 编解码器以原生使用它。

于 2016-11-15T16:05:32.107 回答