小编Fri*_*ing的帖子

Spring WebClient:解析+流非常大的JSON

这个问题类似于来自常规 WebClient 请求的 Spring 反应式流数据,不同之处在于我没有立即从我的 WebClient 获取 JSON 数组,而是这样的:

这个 JSON 对象可能非常大(~100MB),因此需要处理并流式传输到客户端,而不是解析。这是我似乎能够获得正确语义的唯一方法:

{
   "result-set":{
      "docs":[
         {
            "id":"auhcsasb1005_100000"
         },
         {
            "id":"auhcsasb1005_1000000"
         },
         {
            "id":"auhcsasb1005_1000001"
         },
         {
            "id":"auhcsasb1005_1000002"
         },
         ...
         ...
         {
            "EOF":true
         }
      ]
   }
}
Run Code Online (Sandbox Code Playgroud)
WebClient.create()
  .get()
  .retrieve()
  .bodyToMono(DontKnowWhatClass.class)
  .flatMapMany(resultSet -> Flux.fromIterable(resultSet.getDocs()))
Run Code Online (Sandbox Code Playgroud)

但这意味着我在内存中反序列化 100MB 或更多,然后从中创建通量。我想知道的是:我是否遗漏了一些重要的东西?我可以以某种方式从这样的对象创建 Flux 吗?遗憾的是,我现在有办法影响结果集对象的呈现方式。

spring-webflux

10
推荐指数
1
解决办法
914
查看次数

反应式 spring-data-solr 存储库

我找到了一篇关于 spring-data 反应式存储库的博客文章。有人提到,它目前支持 MongoDB、Apache Cassandra 和 Redis。

我们将在我们的反应式(基于 vert'x)架构中使用 spring-data-solr 存储库。

是否有可能在这种类型的存储库中轻松获得反应式支持?实施自己的反应式 solr 存储库需要多少努力?

java spring solr spring-data-solr project-reactor

5
推荐指数
1
解决办法
615
查看次数

将客户端响应转换为服务器响应

我正在尝试在 REST 服务器和调用客户端应用程序之间编写一种代理,以便通过向 REST 调用添加属性来强制执行隐私。

我不想检查来自服务器的响应,我只想将其传递给客户端。

我想用 spring-webflux 做到这一点,因为我希望通过事件驱动的方法节省一些 CPU。但我完全被困住了。

这是,我尝试:

public Mono<ServerResponse> select(ServerRequest request) {
  return request.principal().flatMap((principal) -> {
    return WebClient.create(solrUrl).get().uri(f -> {
              URI u = f.path(request.pathVariable("a")).path("/b/").queryParams(queryModifier.modify(principal, request.pathVariable("collection"), request.queryParams()).block()).build();
              if (debug) {
                log.debug("Calling {}", u);
              }
              return u;
            })
        .exchange()
          .flatMap((ClientResponse mapper) -> {
            BodyBuilder bodyBuilder = ServerResponse.status(mapper.statusCode());
            bodyBuilder.body(BodyInserters.fromDataBuffers(mapper.bodyToFlux(DataBuffer.class)));
            bodyBuilder.headers(c -> mapper.headers().asHttpHeaders().forEach((name, value) -> c.put(name, value)));
              //.body(DefaultserverreBodyInserters.fromPublisher(mapper.bodyToMono(DataBuffer.class), DataBuffer.class)));
              //.body(BodyInserters.fromDataBuffers(mapper.bodyToFlux(DataBuffer.class))));
              //.body(BodyInserters.fromDataBuffers(mapper.body(BodyExtractors.toDataBuffers()))));
              //.body(mapper.bodyToMono(String.class), String.class));
              //.build());
            return bodyBuilder.build();
          });
  });
}
Run Code Online (Sandbox Code Playgroud)

我通过 RouterFunction 将它绑定到面向 REST API 的客户端:

@Configuration
public class VoiceRouterFunctions { …
Run Code Online (Sandbox Code Playgroud)

spring-webflux

5
推荐指数
1
解决办法
3708
查看次数

将对 OutputStream 的写入转换为可由 ServerResponse 使用的 Flux&lt;DataBuffer&gt;

我有一个旧库,必须使用它来检索文件。这个遗留库不会像您通常期望的那样在 InputStream 中返回读取内容,但它期望它传递一个开放的 OutputStream,以便它可以写入。

我必须编写一个 Webflux REST 服务,将该 OutputStream 写入 org.springframework.web.reactive.function.server.ServerResponse 主体。

legacyLib.BlobRead(outputStream); // writes the stream to an outputstream, that has to be provided by me, and somehow has to end up in the ServerResponse
Run Code Online (Sandbox Code Playgroud)

由于我想将 Stream 直接传递给 ServerResponse,我可能必须做这样的事情,对吧?

ServerResponse.ok().body(magicOutpuStreamToFluxConverter(), DataBuffer.class);
Run Code Online (Sandbox Code Playgroud)

spring-webflux

5
推荐指数
1
解决办法
7857
查看次数