我的Spring webflux flatMap,doOnNext,doFinally不会被内部Mono调用吗?

水手:

我绝对不是反应堆新手。我的flatMap,doOnNext,doFinally没有被内部Mono调用。我添加了示例测试并描述了问题的输出。即使getMeIntegerMono2我互换也不会被呼叫getMeStringMono,我在做什么错了?

@Test
    public void prodBug() {
        System.out.println(Final());
    }

    String Final(){
        final String[] val = new String[1];
        System.out.println("1 - "+Thread.currentThread().getName());

        Mono<Integer> intMono =
                getMeIntegerMono("2")
                        .doOnNext(integer -> {
                            getMeIntegerMono2("21")
                                    .flatMap(s -> getMeStringMono(String.valueOf(s)));
                        });

        System.out.println("2 - "+Thread.currentThread().getName());

        intMono.subscribe(integer -> {
            val[0] =String.valueOf(integer);
        });
        System.out.println("3 - "+Thread.currentThread().getName());
        return val[0];
    }

    Mono<String> getMeStringMono(String val){
        System.out.println("String Mono - "+Thread.currentThread().getName());
        return Mono.just(val);
    }


    Mono<Integer> getMeIntegerMono(String val){
        System.out.println("Integer Mono - "+Thread.currentThread().getName());
        return Mono.just(Integer.parseInt(val));
    }

    Mono<Integer> getMeIntegerMono2(String val){
        System.out.println("Integer Mono2 - "+Thread.currentThread().getName());
        return Mono.just(Integer.parseInt(val));
    }

输出是

1 - main
Integer Mono - main
2 - main
Integer Mono2 - main
3 - main
2

流程结束,退出代码为0

熊猫:

您的代码存在一些问题。

在Reactor中,除非您订阅否则什么也不会发生也就是说,仅创建Mono并不会执行任何操作。在传递给的函数中doOnNext,您将创建一个从未订阅的Mono。因此,传递给您的函数flatMap将永远不会被调用。尝试使用flatMap代替doOnNext(您需要稍微弄些类型才能使其工作)。

测试方式的一个问题来自“组装时间”与“执行时间”之间差异在所有getMe*方法中,您都会立即打印一些内容,然后返回Mono。实际上,这在调试时会产生误导,因为即使在组装过程中都不会执行返回的Mono,但打印仍会在组装期间进行。您可以在执行时执行副作用,而不是使用Mono.defer()Mono.fromSupplier()

使用数组来解决Java对变量和lambda的限制的技术是一种不好的做法,尽管在这种情况下它可能会起作用,但是您应该摆脱这种习惯,因为它非常脆弱。要理解为什么,请想象您的链中的某些Mono在另一个线程中执行了昂贵的操作。这意味着传递给您的函数subscribe将在返回后被 调用Final()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章