WebClient는 내부적으로 Netty를 기반으로 동작
실제 처리 스레드는 LoopResources 라는 Netty의 이벤트루프(default는 ForkJoinPool
)
한정된 스레드 수의 스레드풀
onSubscribeon()
으로 스레드풀로 실행하게 되면, 실행 지점을 변경하는 거라서 그 이후의 작업들도 다 boundedElastic
에서 실행된다.
이거 다시 돌려놓으려면
그 이후에 publishOn(Schdulers.parallel())
로 NIO 스레드로 전환해주어야 함
Mono.just()
.flatMap(arg ->
Mono.fromRunnable(() -> {
repository.saveAll(arg);
}).subscribeOn(Schedulers.boundedElastic())
doOnNext((e) -> log.info("실행 절대 안됨"))
이렇게하면 doOnNext()
는 실행 안됨.
Mono.fromRunnable
은 Mono<Void>
를 반환해서 그 이후에 값을 emit 하는 게 없어서 실행이 안되는 것.
실행되게 하려면 Mono.fromCallable
사용해서 값을 emit 하도록 할 것
js처럼 scope chain이 있는건가?
람다 클로저가 있다고 함.
Mono/Flux 실행 흐름 자체가 람다로 구성되어 있음. 람다 내부에서 파라미터를 참조하면 JVM이 캡쳐해서 체인이 실행되기전에 람다 객체는 그 변수들을 "붙잡고 있음" 실행 시점이 뒤늦게 와도 문제 없음(이미 갖고 있기 때문)