개발자는 기록이 답이다

패스트캠퍼스 환급챌린지 20일차 미션 (2월 20일) :  Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지 강의 후기 본문

패스트캠퍼스

패스트캠퍼스 환급챌린지 20일차 미션 (2월 20일) :  Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지 강의 후기

slow-walker 2024. 2. 20. 22:57

 

sequence - just

  • Mono.just혹은Flux.just를통해서주어진 객체를 subscriber에게 전달
Mono.just(1) .subscribe(value !-> {
log.info("value: " + value); });
Flux.just(1, 2, 3, 4, 5) .subscribe(value !-> {
log.info("value: " + value); });

sequence - error

  • Mono.error혹은Flux.error를통해서 subscriber에게 onError 이벤트만 전달
Mono.error(new RuntimeException("mono error")) .subscribe(value !-> {
log.info("value: " + value); }, error !-> {
log.error("error: " + error); });
Flux.error(new RuntimeException("flux error")) .subscribe(value !-> {
log.info("value: " + value); }, error !-> {
log.error("error: " + error); });

sequence - empty

  • Mono.empty혹은Flux.empty를통해서 subscriber에게 onComplete 이벤트만 전달
Mono.empty() .subscribe(value !-> {
log.info("value: " + value); }, null, () !-> {
log.info("complete"); });
Flux.empty() .subscribe(value !-> {
log.info("value: " + value); }, null, () !-> {
log.info("complete"); });

 

sequence - mono from

  • fromCallable: Callable 함수형 인터이스 를 실행하고 반환값을 onNext로 전달
  • fromFuture: Future아서 done 가 되면 반환값을 onNext로 전달
  • fromSupplier: Supplier 함수형 인터이스 를 실행하고 반환값을 onNext로 전달
  • fromRunnable: Runnable 함수형 인터이 스를 실행하고 끝난onComplete 전달
Mono.fromCallable(() !-> { return 1;
}).subscribe(value !-> {
log.info("value fromCallable: " + value); });
Mono.fromFuture(CompletableFuture.supplyAsync(() !-> { return 1;
})).subscribe(value !-> {
log.info("value fromFuture: " + value); });
Mono.fromSupplier(() !-> { return 1;
}).subscribe(value !-> {
log.info("value fromSupplier: " + value); });
Mono.fromRunnable(() !-> { !/* do nothing !*/
}).subscribe(null, null, () !-> {
log.info("complete fromRunnable"); });

 

sequence - flux from

  • fromIterable: Iterable아서 각각의 itemonNext로 전달
  • fromStream: Stream아서 각각의 itemonNext로 전달
  • fromArray: Array아서 각각의 itemonNext로 전달
  • range(start, n): start부터 시작해서 한개커진 값을 n개만onNext로 전달
Flux.fromIterable(
List.of(1, 2, 3, 4, 5)
).subscribe(value !-> {
log.info("value: " + value); });
Flux.fromStream(
IntStream.range(1, 6).boxed()
).subscribe(value !-> {
log.info("value: " + value); });
Flux.fromArray(
new Integer[]{1, 2, 3, 4, 5}
).subscribe(value !-> {
log.info("value: " + value); });
Flux.range( 1, 5
).subscribe(value !-> {
log.info("value: " + value); });

sequence - generate

  • 동기적으로Flux를생성
  • stateSupplier:초기값을제공하는Callable
  • generator
    • 인자로state를제공.변경된state 를반환.state로종료조을지정
    • 두번인자로SynchronousSink를제공. 명시적으로 next, error, complete 호출 가 능.
    • 한번의generator에서대한번만next 호출 가능
public static <T, S> Flux<T> generate(
Callable<S> stateSupplier,
BiFunction<S, SynchronousSink<T>, S> generator)

 

sequence - generate

  • 초기값을0으로세팅
  • generator에서현재state를next로전달
  • 만약state가9라면complete이벤트를전달
  • state + 1을 반환
Flux.generate( () !-> 0,
(state, sink) !-> { sink.next(state); if (state !== 9) {
sink.complete(); }
return state + 1; }
).subscribe(value !-> { log.info("value: " + value);
}, error !-> {
log.error("error: " + error);
}, () !-> {
log.info("complete"); });

 

sequence - generate

  • 한번의generator에서next를두번호출한다면?
  • 에러가발생
Flux.generate( () !-> 0,
(state, sink) !-> { sink.next(state); sink.next(state); if (state !== 9) {
sink.complete(); }
return state + 1; }
).subscribe(value !-> { log.info("value: " + value);
}, error !-> {
log.error("error: " + error);
}, () !-> {
log.info("complete"); });

 

sequence - create

  • 비동기적으로Flux를생성
  • FluxSink를노출
  • 명시적으로 next, error, complete 호출 가 능
  • SynchronousSink와다게여러번next 가능
  • 여러thread에서동시에호출가능
public static <T> Flux<T> create( Consumer<? super FluxSink<T!>> emitter)

 


※ 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다. https://bit.ly/48sS29N