Mono.defer()とは何か

Keywords

  • Spring WebFlux

Contents

  • 1. Mono.defer()とは
  • 2. 参考URL

Mono.defer()とは

Mono.defer()とは、Subscribeするたびに生産者を生成するようにするメソッドです。

下記のコードを実行すると、標準出力は、

just
1612021350619: reactor-http-nio-2	1612021350618
1612021351630: reactor-http-nio-2	1612021350618
defer
1612021351631: reactor-http-nio-2	1612021351631
1612021352636: reactor-http-nio-2	1612021352636

のようになります。Mono.justを使った場合は、同じミリ秒を出力しているのに対し、Mono.deferを使った場合は、別のミリ秒を出力しています。

@GetMapping("/defer-test")
    public Mono<String> defer() throws InterruptedException {

        // just
        System.out.println("just");
        Mono<Long> hotPublisher = Mono.just(System.currentTimeMillis());
        hotPublisher.subscribe(SampleController::printWithThread);
        Thread.sleep(1000L);
        hotPublisher.subscribe(SampleController::printWithThread);

        // defer
        System.out.println("defer");
        Mono<Long> coldPublisher = Mono.defer(()->{
            return Mono.just(System.currentTimeMillis());
        });
        coldPublisher.subscribe(SampleController::printWithThread);
        Thread.sleep(1000L);
        coldPublisher.subscribe(SampleController::printWithThread);

        return Mono.just("Hello, World");
    }

参考URL

https://github.com/ale51/webflux-sample/commit/d54b4c3fa4254a9c777226f00d8cd65fb763cd87