反応式プログラミングのMono.defer
1595 ワード
本文はproject reactorに基づいて、reactor-bomバージョンはDysprosium-SR 4で、project reactorデータソースは大体2種類に分けることができます:悪漢型と怠け者型、
mono deferメソッドによるデータソースの作成は怠け者型であり、Mono.justなどのデータソースの作成は悪漢型である.以下に例を示す.
出力結果
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の使用があります.
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));
}