23.11.26 16:31 작성
·
465
1
안녕하세요
예제 코드에서 질문이 있습니다.
@SneakyThrows
public static void main(String[] args) {
String key = "message";
Mono<String> mono = Mono.deferContextual(ctx -> Mono.just("Hello" + " " + ctx.get(key))
.doOnNext(msg -> log.info("context value : {}", msg)))
.subscribeOn(Schedulers.boundedElastic())
.publishOn(Schedulers.parallel())
.transformDeferredContextual((mono2, ctx) -> mono2.map(data -> data + " " + ctx.get(key)))
.contextWrite(context -> context.put(key, "Reactor")).doOnNext(msg -> log.info("contextWrite value : {}", msg));
mono.subscribe(data -> log.info("data : {}", data));
Thread.sleep(100L);
}
설명하시는 내용을 들어보면 코드의 순서와 상관없이
.contextWrite()
이 먼저 발생하여 context에 {message, Reactor} 값을 저장하고
Mono.deferContextual
가 실행되어 ctx에서 contextWrite에서 했던 값을 가져오고 있습니다.
이부분이 잘 이해가 안가는데요
그전 강의까지는 `.subscribeOn`, `.publishOn` 이런 메서드의 체이닝은 탑다운 방식으로 진행되었었는데
Context부터는 순서가 달라 혹시 실행하는 우선순위가 있는지 궁금합니다.
답변 1
2
2023. 11. 26. 22:19
안녕하세요?
Context에 담긴 정보를 Downstream에서 Upstream으로 전파해서 사용하는 방식이 이해가 안되신다는 질문으로 이해 했습니다.
Context를 어떤 용도로 쓰느냐에 따라서 보는 관점이 달라질 것 같긴한데 Reactor 공식 문서를 보면 Context는 Subscriber의 구독 메커니즘과 연결이 되어 있고, 구독이 발생했다는 signal(subscription signal)이 upstream으로 이동하는것과 같은 방식으로 Context에 wirte을 할 수 있다라는 설명이 예시를 통해 나와 있습니다.
다만, 왜 Context를 꼭 아래에서 위로 전파하는지에 대한 이유를 명시적으로 설명하고 있지는 않습니다.
대신에 어느 정도 유추를 해 볼 수는 있는데요.
Context에는 주로 인증 정보나 환경 설정 값 등 직교 정보(orthogonal information)가 저장되는 직교성을 가지는 이런 정보들은 주로 데이터 소스를 가져올 때 사용될 수 있습니다.
데이터 소스는 최상위 Upstream에서 주로 가져올텐데 최상위 Upstream에서 Context의 최신 정보를 이용하기 위해서는 아무래도 아래쪽에서 위로 전파된 최신 Context를 이용하는게 자연스러울꺼라 생각합니다.
참고로 여기서 말하는 직교 정보는 Subscriber 당 하나씩 연결된 독립적인 Context에 저장된 정보로 보시면 될 것 같습니다.