DEV.EUN
<
2025 April
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2025-04-29

    WebFlux

    ForkjoinPool

    WebClient는 내부적으로 Netty를 기반으로 동작 실제 처리 스레드는 LoopResources 라는 Netty의 이벤트루프(default는 ForkJoinPool)

    BoundedElastic

    한정된 스레드 수의 스레드풀

    • 디폴트 스레드 수 : 코어수* 10
    • 디폴트 큐 사이즈 : 스레드 당 100,000

    onSubscribeon() 으로 스레드풀로 실행하게 되면, 실행 지점을 변경하는 거라서 그 이후의 작업들도 다 boundedElastic 에서 실행된다.

    이거 다시 돌려놓으려면 그 이후에 publishOn(Schdulers.parallel()) 로 NIO 스레드로 전환해주어야 함

    Mono.fromRunnable()

    Mono.just()
        .flatMap(arg -> 
            Mono.fromRunnable(() -> {  
                repository.saveAll(arg);
            }).subscribeOn(Schedulers.boundedElastic())  
        doOnNext((e) -> log.info("실행 절대 안됨"))
    

    이렇게하면 doOnNext()는 실행 안됨. Mono.fromRunnableMono<Void>를 반환해서 그 이후에 값을 emit 하는 게 없어서 실행이 안되는 것. 실행되게 하려면 Mono.fromCallable 사용해서 값을 emit 하도록 할 것

    mono나 flux 안에서 어떻게 외부 변수를 참조할 수 있는지?

    js처럼 scope chain이 있는건가?

    람다 클로저가 있다고 함.

    Mono/Flux 실행 흐름 자체가 람다로 구성되어 있음. 람다 내부에서 파라미터를 참조하면 JVM이 캡쳐해서 체인이 실행되기전에 람다 객체는 그 변수들을 "붙잡고 있음" 실행 시점이 뒤늦게 와도 문제 없음(이미 갖고 있기 때문)