当前位置: 首页 > 知识库问答 >
问题:

将输出流写入转换为可由服务器响应使用的Flux

柳经纶
2023-03-14

我有一个旧库,我必须使用它来检索文件。这个遗留库不会以InputStream的形式返回,正如您通常在阅读资料时所期望的那样,但它希望传递给它一个开放的OutputStream,它可以对其进行写入。

我必须编写一个WebFlow REST服务,它将此OutputStream写入org.springframework.web.reactive.function.server.服务器响应主体。

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

因为我想沿着Stream直接传递到Server响应,所以我可能必须做这样的事情,对吗?

ServerResponse.ok().body(magicOutpuStreamToFluxConverter(), DataBuffer.class);

共有1个答案

经俊茂
2023-03-14

这里是RequestHandler中重要的一部分;我遗漏了一些异常的错误处理/捕获,这些通常是不需要的。请注意,我为读取发布了不同的计划程序(或者至少,这是我想要做的),以便此阻止读取不会干扰我的主事件线程:

private Mono<ServerResponse> writeToServerResponse(@NotNull FPTag tag) {
    final long blobSize = tag.getBlobSize();
    return ServerResponse.ok()
        .contentType(MediaType.APPLICATION_OCTET_STREAM)
        .body(Flux.<DataBuffer>create((FluxSink<DataBuffer> emitter) -> {
      // for a really big blob I want to read it in chunks, so that my server doesn't use too much memory
      for(int i = 0; i < blobSize; i+= tagChunkSize) {
        // new DataBuffer that is written to, then emitted later
        DefaultDataBuffer dataBuffer = new DefaultDataBufferFactory().allocateBuffer();
        try (OutputStream outputStream = dataBuffer.asOutputStream()) {
          // write to the outputstream of DataBuffer
          tag.BlobReadPartial(outputStream, i, tagChunkSize, FPLibraryConstants.FP_OPTION_DEFAULT_OPTIONS);
          // don't know if flushing is strictly neccessary
          outputStream.flush();
        } catch (IOException | FPLibraryException e) {
          log.error("Error reading + writing from tag to http outputstream", e);
          emitter.error(e);
        }
        emitter.next(dataBuffer);
      }
      // if blob is finished, send "complete" to my flux of DataBuffers
      emitter.complete();
    }, FluxSink.OverflowStrategy.BUFFER).publishOn(Schedulers.newElastic("centera")).doOnComplete(() -> closeQuietly(tag)), DataBuffer.class);

}
 类似资料:
  • 我的应用程序实现了VpnService来拦截流量并提供量身定制的响应。目标是处理到特定地址的流量,并丢弃其他请求。 目前,我成功地解析了传入的请求,构建并发送了响应。然而,问题是这些响应并不是对原始请求的实际响应;使用套接字连接进行测试只是超时。 为了进行这一区分,我目前正在解析VPN服务输入流中的原始IP数据包,如下所示: IpDatagram是一个类,通过它可以将字节数组解析为IP数据包的表示

  • 问题内容: 我将输入流从Web转换为位图时遇到问题。仅当输入图像类型为.BMP(位图)时,才会出现问题。在这种情况下: bitmapFactory.decodeStream返回null 。 有什么提示如何解决此问题,或者应该在哪里继续调试? 平台:Android(蜂窝) 问题答案: 谢谢@Amir指出日志。发现了一条线: 这似乎是一个普遍的问题。进行搜索后,我找到了解决方案。 我以前的代码: 起作

  • 我需要使用JOLT转换将下面的输入转换为精确的输出。输入: 输出: 我尝试使用以下规格,但没有驱动到我需要的精确输出。规格: 任何帮助都将不胜感激。谢谢

  • 我试着用另一个文件,当转换到EDI 837 I到XML时,出现了以下错误。这些字段是强制性字段吗? 我手动将值传递给ISA09、ISA10和ISA13,然后我收到 分析过程中遇到错误。id为“”、发送方id为“”、接收方id为“”的X12交换发生以下错误: 错误:4(字段级错误)段ID:ISA在TS中的位置:1数据元素ID:ISA09在段中的位置:9数据值:8:无效日期 错误:5(字段级错误)段I

  • 我能得到php mime电子邮件解析器/解码器的帮助吗https://code.google.com/p/php-mime-mail-parser/不涉及任何安装。我甚至试过phpclasses的Zend和decoder。org,但没有帮助。我找不到如何将输入输入程序并从中获取输出,因为没有这方面的教程 我的目标:我需要将mime邮件从输入流转换为可读文本 请帮帮忙

  • 我试图在Netty中实现一个NTLMProxyHandler,该NTLMProxyHandler可以执行NTLM消息交换,并通过web代理对客户端进行身份验证。 NTLMProxyHandler扩展了Netty的ProxyHandler类。因此,代理处理程序会触发一个初始的HTTP请求,并到达我创建的模拟代理服务器。代理服务器读取此请求,并以407代理身份验证所需的响应进行响应。 我在日志中启用了