2017-09-27 3 views
0

5 초 내에 텍스트를 입력하지 않으면 TimeoutException이 발생하지 않습니다. 아래 코드 메서드는 getMsg()를 호출하고 텍스트 입력을 기다립니다. 나는 'timeout (5, TimeUnit.SECONDS)'을 추가하여 입력을 위해 5 초 동안 만 기다렸다. 사용자가 5 초 안에 msg를 입력하지 않은 경우 시간 초과 오류를 표시하려고합니다.rxJava 시간 초과 유틸리티를 사용할 때 TimeoutException이 발생하지 않습니다.

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.concurrent.TimeUnit; 

import rx.Observable; 

public class TestRx { 

    public static void main(String[] args) throws IOException { 
     Observable.just(getMsg()) 
      .timeout(5, TimeUnit.SECONDS) 
      .subscribe(System.out::println, 
        e -> e.printStackTrace()); 
     System.out.println("End..."); 
    } 

    private static String getMsg() throws IOException { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
     System.out.print("Enter a msg:"); 
     String msg = reader.readLine(); 
     return msg; 
    } 
} 

답변

3

getMsg()은 RxJava에 들어가기 전에 실행됩니다. just()은 괄호 안의 코드를 마술처럼 지연시키지 않습니다. 당신은 fromCallable 필요합니다 블로킹이 설정에서 중단되지 주 스레드에서 발생

public static void main(String[] args) { 
    Observable.fromCallable(() -> getMsg()) 
     .timeout(5, TimeUnit.SECONDS) 
     .subscribe(System.out::println, 
       e -> e.printStackTrace()); 
    System.out.println("End..."); 
} 

업데이트. 내가 그것을 가지고

Observable.fromCallable(() -> getMsg()) 
      .subscribeOn(Schedulers.io())    // <---------------------- 
      .timeout(5, TimeUnit.SECONDS) 
      .blockingSubscribe(System.out::println, 
        e -> e.printStackTrace()); 

System.out.println("End..."); 
+0

감사합니다 : 대안은 데이터 또는 종료를 기다릴 subscribeOn 가능한 blockingSubscribe을 사용하는 것입니다. 난 just() 정적 값 또는 그냥 호출하는 전에 평가해야하는 문을 작동합니다() 메서드를 생각합니다. –

+0

시간 초과 예외가 발생해도 프로그램이 종료되기를 원하지만 현재 시간 초과 오류가 발생해도 여전히 실행 중입니다. 실행중인 프로그램을 종료하는 방법을 제안하십시오. –

+0

블로킹은 RxJava의 범위를 벗어난 Java 주 스레드에서 발생하기 때문에 백그라운드 스레드에서 getMsg()를 실행해야합니다. 이에 따라 답변이 업데이트되었습니다. – akarnokd