Context란?
- Reactor Sequence 상에서 상태를 저장할 수 있고, 저장된 상태 값을 Operator 체인에서 공유해서 사용할 수 있는 인터페이스이다.
- Context 에 저장할 상태 값은 key, value 형태로 저장된다.
- Context에 값을 저장하기 위해서는 contextWrite()을 사용한다.
- Context에서 값을 읽어오기 위해서는 읽기 전용 뷰인 ContextView를 사용한다.
- ContextView는 Reactor Sequence에서 deferContextual() 또는 transformDeferredContextual()을 통해서 제공된다.
Mono<String> mono = Mono.deferContextual(ctx ->
Mono.just("Hello" + " " + ctx.get(key)).doOnNext(Logger::doOnNext)
)
.subscribeOn(Schedulers.boundedElastic())
.publishOn(Schedulers.parallel())
.transformDeferredContextual((mono2, ctx) -> mono2.map(data -> data + " " + ctx.get(key)))
.contextWrite(context -> context.put(key, "Reactor"));
mono.subscribe(Logger::onNext);
자주 사용되는 Context API
put(key, value) : key/value 형태로 Context 에 값을 쓴다
Context.of(Key1, value1, key2, value2, ...) : key/value 형태로 Context 에 여러개의 값을 쓴다
putAll(ContextView) : 입력된 ContextView를 merge 한다.
delete(key) : Context에서 key에 해당하는 value를 삭제한다.
자주 사용되는 ContextView API
get(key) : ContextView 에서 key에 해당하는 value를 반환한다.
getOrEmpty(key) : ContexxtView에서 kkey에 해당하는 value를 Optional로 래핑해서 반환한다.
getOrDefault(key, default value) : ContextView 에서 key에 해당하는 value를 가져온다. key에 해당하는 value가 없으면 default value를 가져온다.
hashKey(key) : ContextView에서 특정 key가 존재하는지를 확인한다.
isEmpty() : Context가 비어있는지 확인한다.
size() : Context내에 있는 key/value의 개수를 반환한다.
Context 의 특징
- Context 는 각각의 subscriber를 통해 Reactor Sequence에 연결되며 체인에 각각 Operator들이 실행 쓰레드가 달라도 연결된 Context에 접근할 수 있다.
- Context는 체인의 맨 아래에서부터 위로 전파된다.
- Context는 Downstream 에서 Upstream으로 전파된다.
- Operator 체인에서 Context read 메서드가 Context wirte 메서드 밑에 있을 경우에는 write 된 값을 read할 수 없다.
- 따라서 일반적으로 Contex에 write 할 때는 Operator 체인의 마지막에 둔다.
- 동일한 키에 대해서 write 할 경우, 값을 덮어쓴다.
- 메인 Operator 내부에서 Sequence를 생성하는 flatMap() 같은 Operator 내에서 wirte 된 Context 값은 Inner Sequence 내부에서만 유효하고, 외부 Operator 체인에서는 보이지 않는다.
'Spring > Webflux' 카테고리의 다른 글
Reactive Programming 2 (0) | 2024.03.01 |
---|---|
Reactive Programming (0) | 2024.03.01 |
Scheduler의 종류 (0) | 2024.02.29 |
Scheduler (0) | 2024.02.29 |
Sinks (0) | 2024.02.29 |