reactive-programming - WebFlux (Reactor) 中的文件处理

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

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

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

最佳答案

Is it sufficient if I write the IO code in an imperative blocking manner and then wrap them in a Mono, publish them on boundedElastic scheduler?

这在某种程度上归结为意见 - 但不,对于 react 性绿地项目恕我直言,肯定不理想。 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);
            }
        });
    });
}

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

关于reactive-programming - WebFlux (Reactor) 中的文件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62188728/

相关文章:

java - Reactor Core - Mono - onError Flatmap

java - Reactive Spring 不支持 ServerHttpRequest 作为 REST 端点测试中的参数?

java - 如何将 Observable.fromCallable() 与已检查的异常一起使用?

.net - 使用 RX Throttle 时的跨线程异常

ios - RxSwift、MVVM、Alamofire/Moya。使用间隔更新股票代码

java - 在 RestController 方法中获取 ServerWebExchange

kotlin - Mono.fromCallable 中的异常不会导致错误

javascript - 无法在anglar4中导入RX

java - SpringData 和 mongoDb 超时

spring-boot - Spring Webflux 微服务中不支持将 javax.json.JsonPatch 作为 @RequestBody