2017-03-07 3 views
0

나는 하루 동안이 일에 매달 렸습니다. Dan Lew great post에서 영감을, 내가 repeatWhen()와 retryWhen()을위한 간단한 테스트 케이스 만들려고 :RxJava : 왜 retryWhen/repeatWhen가 작동하지 않습니까?

public class ObsTest { 

    private static final Logger LOG = LoggerFactory.getLogger(ObsTest.class); 

    @Test 
    public void test1() throws InterruptedException { 

    Observable<Integer> obs = rx.Observable.<Integer> create(observer -> { 
    LOG.info("onSubscribe"); 
    Integer data = RandomUtils.nextInt(0, 1000); 
    if (data % 2 != 0) { 
     observer.onError(new RuntimeException("Odd number " + data)); 
    } else { 
     observer.onNext(data); 
    } 
    observer.onCompleted(); 
    }, BackpressureMode.BUFFER); 

    obs.repeatWhen(completed -> completed.delay(1, TimeUnit.MILLISECONDS)) 
     .retryWhen(error -> error.delay(1, TimeUnit.MILLISECONDS)) 
    .subscribe(i -> LOG.info("value={}", i), e -> LOG.info("Exception = {}", e.getMessage())); 

을}

내 생각이, "올바른"결과로 짝수 발광 영원히 실행해야하고 홀수는 "오류"로 표시됩니다. 대신 하나 또는 두 개의 루프를 실행 한 다음 중지합니다. 그리고 지연이 1 밀리 초일 때, 더 오랜 시간 동안 (즉, 1 초), 그것은 단 한 번의 홀수 또는 짝수 번을 방출하면서 한 번 실행됩니다. 나는 틀린 일을하고 있다고 확신하지만, 그것이 무엇인지는 알 수 없다.

답변

2

기본적으로 Schedulers.computation()을 사용하는 delay을 호출하면 비동기가 도입됩니다. 백그라운드 스레드에서 활동이 시작되면 테스트가 완료되고 프로세스가 종료됩니다. blockingSubscribe을 사용하거나 마지막에 길이가 긴 Thread.sleep을 사용해야합니다.