将阻塞代码包装到Mono flatMap中,这仍然是一种非阻塞操作吗?

时间:2018-01-19 20:56:51

标签: spring reactive-programming blocking nonblocking reactor

如果我将阻塞代码封装到flatMap中,这仍然是非阻塞操作吗?

示例:

    public Mono<String> foo() {

    Mono.empty().flatMap(obj -> {

        try {

        Object temp = f.get();//are the thread at this point blocked or not ?

        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }

        return Mono.just("test");

    });

所以,我认为当我将阻塞代码包装成反应代码时,操作仍然是非阻塞的?如果我错了,请向我解释。

1 个答案:

答案 0 :(得分:1)

  

如果我将阻塞代码封装到flatMap中,这仍然是非阻塞操作吗?

flatMap不会为您创建新主题。例如:

Mono.just("abc").flatMap(val -> Mono.just("cba")).subscribe();

上面的所有代码都将由调用subscribe的当前线程执行。因此,如果映射器函数包含长阻塞操作,则调用subscribe的线程也将被阻塞。

要将其转换为异步操作,您可以使用subscribeOn(Schedulers.elastic());

 Mono.just("abc").flatMap(val -> Mono.just("cba")).subscribeOn(Schedulers.elastic());

Mono和Flux不会创建线程,但是有些运营商会将Scheduler作为额外参数使用,例如interval运算符,或者更改线程模型,例如{{1 }}

另外一件事,在你的例子中,mapper函数永远不会被调用,因为你将flatMap应用到一个空的单声道,它直接完成而没有发出任何值。