反応式プログラミングのMono.defer


本文はproject reactorに基づいて、reactor-bomバージョンはDysprosium-SR 4で、project reactorデータソースは大体2種類に分けることができます:悪漢型と怠け者型、
mono deferメソッドによるデータソースの作成は怠け者型であり、Mono.justなどのデータソースの作成は悪漢型である.以下に例を示す. 
	@Test
	public void defer(){
		//      DeferClass  
		
		Mono m1 = Mono.just(new Date());
		Mono m2 = Mono.defer(()->Mono.just(new Date()));
		m1.subscribe(System.out::println);
		m2.subscribe(System.out::println);
        //  5  
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		m1.subscribe(System.out::println);
		m2.subscribe(System.out::println);
	}

出力結果
Fri Feb 07 10:22:51 GMT+08:00 2020 Fri Feb 07 10:22:51 GMT+08:00 2020 Fri Feb 07 10:22:51 GMT+08:00 2020 Fri Feb 07 10:22:56 GMT+08:00 2020
2つのデータソースが作成され、1つはMono.justで作成され、1つはMono.deferで作成され、それぞれlambda式でこの2つのpublisherを購読し、2つの出力の時間は10:22:51で、5秒遅れて再購読され、Mono.justで作成されたデータソースの時間は変わっていないことがわかります.ただし、Mono.deferが作成したデータソースの時間は、Mono.justが宣言フェーズでDateオブジェクトを構築し、一度だけ作成するため、5秒遅れていますが、Mono.deferはsubscribeフェーズで対応するDateオブジェクトを作成し、subscribeメソッドを呼び出すたびにDateオブジェクトを作成し、webfluxでは
DefaultWebFilterChainのfilterメソッドにはMono.deferの使用があります.
    /**
     **     ,      filter      currentFilter filter    handler handle
     **   ,                   
    ***/
	@Override
	public Mono filter(ServerWebExchange exchange) {
		return Mono.defer(() ->
				this.currentFilter != null && this.next != null ?
						this.currentFilter.filter(exchange, this.next) :
						this.handler.handle(exchange));
	}