Notice
Recent Posts
Recent Comments
Link
개발자는 기록이 답이다
패스트캠퍼스 환급챌린지 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를 받아서 각각의 item을 onNext로 전달
- fromStream: Stream를 받아서 각각의 item을 onNext로 전달
- fromArray: Array를 받아서 각각의 item을 onNext로 전달
- 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