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

WebFlux(反应器)中的文件处理

姬雪松
2023-03-14

我正在进行一个新的反应项目,其中有很多文件处理IO正在进行。如果我以命令式阻塞的方式编写IO代码,然后将它们包装成一个单声道,在boundedElastic调度器上发布它们,这是否足够?boundedElastic池大小会限制并发操作的数量吗?

如果这不是正确的方法,你能展示一个如何使用Reactor将字节写入文件的例子吗?

共有1个答案

狄安歌
2023-03-14

如果我以命令式阻塞的方式编写IO代码,然后将它们包装成一个单声道,在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);
            }
        });
    });
}
 类似资料:
  • 我看到了以下关于如何定制spring security webflux的帖子:spring webflux自定义API身份验证 如果我们在ServerSecurityContextRepository.Load中抛出异常,那么Spring会将http头更新为500,而我无法操作此异常。 但是,在controller中抛出的任何错误都可以使用常规的@ControllerAdvision来处理,这只是

  • 问题内容: 我是新来的反应js。我想用react js异步上传图像假设我有这段代码 任何答案将不胜感激! 问题答案: 你可以利用

  • 我正在我的项目中尝试新的ReactiveQuerydslPredicateExecutor,但我找不到像在QueryDslPredicateExecutor中那样的findAll(谓词,分页)方法 这是故意的吗?这是否意味着对于reactive不建议使用分页?

  • 我正在尝试将Spring Cloud Contract应用于使用Spring WebFlux构建的反应API。基本上能够以以下方式从API发送通量和接收响应通量: 但是,我在网上或文档中找不到关于我是否可以使用Spring Cloud Contract实现这一点的信息。 甚至有可能为此写一份合同吗?它是否能够提供wiremock并生成适当的JUnit测试?