map에서의 TimeUtil.sleep에 관한 궁금점
216
投稿した質問数 1
안녕하세요. 예제 코드를 이것저것 바꿔가며 실행해보다가 궁금한 점이 있어서 질문드립니다.
Observable.range(1, 5)
.doOnNext(data -> Logger.log(LogType.DO_ON_NEXT, data))
.map(num -> {
long time = 1000L;
if(num == 4){
time = 1500L;
}
TimeUtil.sleep(time);
return num;
})
.timeout(1200L, TimeUnit.MILLISECONDS)
.subscribe(
data -> Logger.log(LogType.ON_NEXT, data),
error -> Logger.log(LogType.ON_ERROR, error)
);
doOnNext() | main | 22:42:06.634 | 1
onNext() | main | 22:42:07.636 | 1
doOnNext() | main | 22:42:07.636 | 2
onNext() | main | 22:42:08.636 | 2
doOnNext() | main | 22:42:08.636 | 3
onNext() | main | 22:42:09.637 | 3
doOnNext() | main | 22:42:09.637 | 4
onERROR() | RxComputationThreadPool-1 | 22:42:10.837 | java.util.concurrent.TimeoutException: The source did not signal an event for 1200 milliseconds and has been terminated.위와 같이 코드를 작성하였을때 원본 데이터가 delay함수의 유형2번과 유사하게 동작해서 LogType doOnNext와 doNext가 번갈아 가면서 출력되었습니다.
range()에서 생성된 데이터가 map으로 들어가기 까지는 delay가 없어서 doOnNext가 4번 찍히고 delay 이후에 onNext가 4번찍힐 것으로 예상했는데 번갈아가면서 찍히는 이유가 무엇인가요??
回答 1
1
안녕하세요? 질문자님이 올려주신 소스코드 대로라면
doOnNext와 onNext가 번갈아 가면서 출력되는게 정상입니다.
이유는,
range()에서 1을 내보내면 doOnNext()에서 1을 출력하고, 다음 step으로 map에서 1초의 딜레이 타임을 가진 후에 Subscriber에게 전달이 되기 때문에 Subscriber 쪽의 onNext에서 1이 출력됩니다.
range()에서 내보내진 2, 3도 같은 과정을 거쳐서 doOnNext와 onNext가 번갈아 출력되고 range()에서 4가 내보내지면 doOnNext()에서 4가 출력된 후에 map()에서 1.5초가 딜레이되므로 TimeoutException이 발생합니다.
doOnNext()에서 1부터 4까지 모두 출력된 후에 map()으로 넘어가는게 아니라 원본 Publisher에서 데이터 하나가 내보내지고 중간에 여러 연산자 함수를 거쳐서 Subscriber까지 전달되는 과정이 데이터 하나에 대한 처리 과정이라고 생각하시면 될 것 같아요.
질문에 대한 답이 되셨으면 좋겠습니다.
다른 질문 있으시면 또 편하게 질문 남겨주시면 감사드릴게요.
Single과 관련해 여쭤보고 싶은 부분이 있습니다!
0
264
2
cold/hot publisher 예제 코드와 관련해 질문 드립니다.
0
363
1
CompletableObserver 클래스의 람다식 표현관련
0
297
1
1강에 예시로 보여주신 ToDoSample 코드에 관해 질문 드립니다!
0
356
1
데이터 결합 연산자 / merge 관련 질문
0
445
1
DROP 배압 전략에 관한 궁금증
0
300
2
강의 내용을 정리해서 개인 블로그에 올려도 될까요?
0
562
2
TimeUtil.sleep 관련 질문
0
286
1
배압 전략 중에서 DROP 전략과 관련해서 질문 있습니다.
0
335
1
Error 발생 시에도 계속 처리 방법
0
689
2
선언형 프로그래밍과 명령형 프로그래밍
1
784
2
첫번째 강의 부터 이번강의까지 수강하면서 궁금한점 질문드립니다.
0
325
1
안녕하세요. 질문이 있습니다.
1
354
1
logger 가 없는데 util 폴더도 같이 갖다놔야 하나요?
0
327
1
amb 연산자
0
233
1
질문 드립니다.
0
219
1
concatEager( ) 연산자에 관하여
0
318
1
Reactive Streams의 구성요소들과 RxJava의 구성요소들의 관계?
1
397
2
ObservableSequenceEqualExample.java 예제의 delay( ) 연산자 질문있습니다
0
309
3
defer( ), fromFuture( )도 just( )처럼 여러 인자 값을 받을 수 있는지 궁금합니다.
0
264
3
flatMapSingle() 메소드에 대하여
0
620
6
fromFuture() vs fromCallable() 생성 연산자에 대해
0
573
2
함수형 인터페이스 Comparator에 대해
0
397
2
Publisher와 Subscriber 간의 프로세스 흐름에 대한 질문
1
340
3

