본문 바로가기
슬기로운 자바 개발자 생활/스프링 및 자바웹 서비스

Spring WebFlux, RX JAVA ReplaySubject

by 슬기로운 동네 형 2022. 11. 8.
반응형

구독자가 새로 생기면 항상 데이터의 처음부터 끝까지 발행한다. 최근 구독자는 예전 구독자들이 받은 데이터들까지 받게 된다. 이거 위험하다. 데이터량이 엄청나면.... 다 받으니 메모리 문제가 일어나니까 조심해야 됨.

 

대략 RxJava 예)

ReplaySubject<String> subject = ReplaySubject.create();
subject.subscribe(data -> System.out.println(("Subscriber 1# => "+ data)));

int value = 0;

for(int i=0 ; i < 100 ; i++){
    value++;
    subject.onNext("D " + value);
}

subject.subscribe(data -> System.out.println(("Subscriber 2# => "+ data)));

 // 만약 value 가 엄청난 용량의 데이터라면? 문제임...

subject.onNext("D " + value+1);
subject.onComplete();

스프링 WebFlux에도 있을까? 문서를 찾아보니 있다... 정말 많이 사용하지 않나보다.

 

누군가 스택오버플로우에 이런 질문을 했다.

 

ㅎㅎ.

ReplayFlux<>  그럴듯하지만.. 없다.

 

https://projectreactor.io/docs/core/release/api/index.html

 

reactor-core 3.4.24

 

projectreactor.io

 

해당 문서로 들어가서 Replay를 조회하니. 마블다이어그램과 Class가 나온다.

 

 

ReplayProcessor<String> re = ReplayProcessor.create();
re.subscribe(data -> System.out.println("Spring ReplayProcessor 1# : " + data));
int infDataInt = 0;

for(int i=0 ; i < 10 ; i++){
    infDataInt++;
    re.onNext("D " + infDataInt);
}

re.onNext("Spring WebFlux Data " + infDataInt);

re.subscribe(data -> System.out.println("Spring ReplayProcessor 2# : " + data));

re.onNext("D " + infDataInt+1);
re.onComplete();

스프링 WebFlux 버전으로 만들어 보고.

테스트 결과 두번째 구독자가 구독을 하게 되면 아래 처럼 발행되었던 모든 데이터를 다시 받을 수 있다.

반응형

댓글