首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >链式doOnNext用于返回Flux的方法,但在直接调用Flux对象时不起作用。

链式doOnNext用于返回Flux的方法,但在直接调用Flux对象时不起作用。
EN

Stack Overflow用户
提问于 2022-09-02 00:11:29
回答 1查看 47关注 0票数 0

使用Spring,我注意到只有在将doOnNext对象分配给局部变量之前才对Flux对象执行doOnNext

为了观察这种行为,我使用了一个应用程序,它是使用使用默认设置创建的。我选择添加到POM中的唯一依赖项是“”。

代码语言:javascript
运行
复制
@Controller
public class ProblemController {
    @PostMapping("/upload")
    public Mono<ResponseEntity<String>> upload(ServerWebExchange exchange) {
        Flux<DataBuffer> body = exchange.getRequest().getBody()
                // This prints!
                .doOnNext(db -> System.out.println("Bytes A: " + db.readableByteCount()));

        // Does not print anything...
        body.doOnNext(db -> System.out.println("Bytes B: " + db.readableByteCount()));

        return body
                .next()
                .map(db -> String.format("Uploaded %d bytes", db.readableByteCount()))
                .map(s -> new ResponseEntity<String>(s, HttpStatus.ACCEPTED));
    }
}

当我上传一个文件时

代码语言:javascript
运行
复制
curl --location --request POST 'http://localhost:8080/upload' \
--form 'file=@"/path/to/file.txt"'

我可以看到只有Bytes A消息被打印出来。

甚至我也添加了更多的doOnNext回调,它们看起来都是执行的,

代码语言:javascript
运行
复制
        Flux<DataBuffer> body = exchange.getRequest().getBody()
                // This prints!
                .doOnNext(db -> System.out.println("Bytes A: " + db.readableByteCount()))
                .doOnNext(db -> System.out.println("Bytes X: " + db.readableByteCount()));

打印Bytes ABytes X

不过,它从不打印Bytes C。这给我的印象是,当Flux对象被分配给局部变量(Flux<DataBuffer> body)时,它会发生变化。

在这个例子中到底发生了什么?为什么我看不见Bytes C打印?

EN

Stack Overflow用户

回答已采纳

发布于 2022-09-02 08:00:21

Flux或Mono中的每个操作符都返回一个新实例。当您链接调用时,最终将构建每个中间实例并获得“外部”实例。

对于Bytes C示例,您只需调用该方法,而不将生成的新实例分配给任何变量,因此该实例已被垃圾收集,从未成为执行路径的一部分。

https://projectreactor.io/docs/core/release/reference/#faq.chain

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73576552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档