【问题标题】:File handing in WebFlux (Reactor)WebFlux (Reactor) 中的文件处理
【发布时间】:2020-06-04 07:06:09
【问题描述】:

我正在开发一个新的响应式项目,其中 很多 文件处理 IO 正在进行。如果我以命令式阻塞方式编写 IO 代码,然后将它们包装在 Mono 中,将它们发布到 boundedElastic 调度程序上就足够了吗? boundedElastic 池大小会限制并发操作的数量吗?

如果这不是正确的方法,您能否举例说明如何使用 Reactor 将字节写入文件?

【问题讨论】:

  • 在没有上下文的情况下很难回答这些问题,如果您可以举例说明其中一项交易是什么样的,那可能会有所帮助。话说,IO处理之前做什么,之后做什么,谁触发这个事务等等。

标签: reactive-programming spring-webflux project-reactor reactor spring-reactor


【解决方案1】:

如果我以命令式阻塞方式编写 IO 代码,然后将它们包装在 Mono 中,将它们发布到 boundedElastic 调度程序上是否足够?

这在某种程度上归结为意见 - 但不,对于一个反应性的新建项目恕我直言,当然不理想。 boundedElastic() 调度程序非常适合在您必须时与阻塞 IO 交互,但当存在真正的非阻塞解决方案时,它们并不是一个好的替代品。 (有时这对于文件处理有点争议,因为这取决于底层系统是否有可能异步执行此操作 - 但现在通常这是可能的。)

在您的情况下,我会考虑将 AsynchronousFileChannel 包装在反应式发布者中。为此,您需要使用create()push(),然后显式调用sink,但具体如何执行此操作取决于您的用例。作为文件写入的“最简单情况”,您可以执行以下操作:

static Mono<Void> writeToFile(AsynchronousFileChannel channel, String content) {
    return Mono.create(sink -> {
        byte[] bytes = content.getBytes();
        ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
        buffer.put(bytes);
        buffer.flip();

        channel.write(buffer, 0, null, new CompletionHandler<>() {
            @Override
            public void completed(Integer result, Object attachment) {
                sink.success();
            }

            @Override
            public void failed(Throwable exc, Object attachment) {
                sink.error(exc);
            }
        });
    });
}

可以在here 找到一个更彻底/全面的桥接这两个 API 的示例 - 几乎可以肯定还有其他 API。

【讨论】:

  • 谢谢,我会深入研究的!我还是应该在 boundedElastic 上发布这些吧?
  • @Peter 不,您不需要在任何特定的调度程序上发布这些 - 以这种方式读取和写入是完全异步的,因此您可以正常使用事件循环。请注意,这(不幸的是)并不能保证实际上打开 AsynchronousFileChannel 首先,因此您(可能,取决于上下文)希望将打开调用包装在 boundedElastic 调度程序或类似的.
  • 在阅读了我找到的关于 AsynchronousFileChannel 的所有文档和资源后,我补充了一些想法:异步部分来自于 your 线程没有被阻塞,而是 JVM 提供了一个发生阻塞的专用池。 docs.oracle.com/javase/7/docs/api/java/nio/channels/… 另外,Linux 不支持真正的非阻塞 IO,只有较新的 Windows 系统支持。
猜你喜欢
  • 1970-01-01
  • 2018-09-09
  • 1970-01-01
  • 2017-07-29
  • 2022-06-05
  • 1970-01-01
  • 2019-12-23
  • 2021-11-12
  • 2015-07-17
相关资源
最近更新 更多