Web Services Java Spring WebFlux中从REST控制器返回(大)文件的正确React模式是什么?

vfwfrxfs  于 2022-11-15  发布在  Java
关注(0)|答案(1)|浏览(101)

情况:

  • 我有一个非React式遗留库,它需要一个OutputStream并将其输出写入其中,方法签名类似于void produceData(OutputStream stream)
  • 我想通过Web服务将方法的输出公开为PDF文件
  • 文件有时可能非常大
  • 我使用的是React式框架Spring WebFlux

动机:

  • 我希望我的代码保持“尽可能的React”
  • 我不想一次为所有数据分配一个字节数组,我想最大限度地利用传统方法将输出写入OutputStream这一事实

问题:

  • 一般来说,WebFlux中返回大文件的正确React模式是什么?
  • 当数据源是写入给定OutputStream的非React式方法时,WebFlux中返回大文件的正确React式模式是什么?
  • 我还应该能够让客户端了解Web服务的输出是一个具有适当名称的PDF文件。

我正在考虑:

  • Mono<ByteArrayResource> getData()-我不想使用它,因为我必须为整个内容分配字节数组。
  • 在 * 非React式 * 环境中,我只会将ServletResponse对象注入到控制器方法中,并将其输出流ServletResponse.getOutputStream()传递给我的遗留方法,但我不知道如何在 * React式 * 环境中执行此操作,也不知道是否建议这样做。
  • Mono<DataBuffer> getData()-在控制器代码中,我可以很容易地从DefaultDataBufferFactory获得一个新的DataBuffer,并使用它的asOutputStream()方法,但我不知道如何正确处理,因此DataBuffer是在客户端使用数据后释放的。
    处理此类情况的正确React模式是什么?
myss37ts

myss37ts1#

调用一个无React的方法是完全可以的,唯一重要的是保持React流的React性,而不是阻塞它
例如,

someRepository.findById( id )
               .map( entity -> entity.setValue( value ) )
               .filter( entity -> entity.someCondition > other condition )
               .map( entity -> someNonReactiveLibrary.function(entity.getAttribute())) //non-reactive method
                .collect( Collectors.toList());

如果你看到整个代码块在一个线程中执行,并且是连续的,在这个特定的流程中,你可以包括非React性方法,这是完全正常的。

相关问题