2012-03-23 5 views
2

나는이 소요 뭔가 시간을 할 수있는 배우를 호출하는 것을 시도하고있다. 호출자와 5 초 타이머를 설정. 하지만 try/catch 시간 초과 예외를 처리 할 수 ​​없습니다. 당신이 할 수있는어떻게 AskTimeoutException을 처리하기 위해?

return async(Akka.asPromise(ask(myActor, "hello", uploadImageTimeout)).map(new Function<Object, Result>() { 
@Override 
public Result apply(Object response) { 
return ok("Done"); 
} 
})); 

답변

3

한 가지는 바로 Akka 미래 내부 예외에서 "회복"하는 것입니다

return async(Akka.asPromise(ask(myActor, "hello", uploadImageTimeout).recover(
    new Recover<Object>() { 
     @Override 
     public Object recover(Throwable t) throws Throwable { 
      if(t instanceof AskTimeoutException) { 
       Logger.error("Got exception: ", t); 
       return internalServerError("Timeout"); 
      } 
      else { 
       Logger.error("Got exception: ", t); 
       return internalServerError("Got Exception: " + t.getMessage()); 
      } 
     } 
    }) 
).map(new Function<Object, Result>() { 
    @Override 
    public Result apply(Object response) { 
     if(response instanceof Result) { 
      // Result objects are returned by the recover handler above 
      return (Result)response; 
     } 
     else { 
      return ok(doSomethingWithResponse(response)); 
     } 
    } 
})); 
+0

광산을 발견했다. 복구하려면 PartialFunction 객체가 필요하며 어떤 예제도 찾지 못했습니다. – gavioto

0

재생 2.2.1 (및 Akka 2.2)를 사용하여 솔루션의 사소한 변경이 필요합니다. 소스 코드 테스트는 응답을 찾는 최상의 사이트입니다. 나는이 작동하지 않습니다 재생 2.2.1의 새로운 Recover를 사용하려고 여기 https://github.com/akka/akka/blob/f1edf789798dc02dfa37d3301d7712736c964ab1/akka-docs/rst/java/code/docs/future/FutureDocTest.java

@Test 
public void useRecover() throws Exception { 
    //#recover 
    final ExecutionContext ec = system.dispatcher(); 
    Future<Integer> future = future(new Callable<Integer>() { 
     public Integer call() { 
     return 1/0; 
     } 
    }, ec).recover(new Recover<Integer>() { 
     public Integer recover(Throwable problem) throws Throwable { 
     if (problem instanceof ArithmeticException) 
      return 0; 
     else 
      throw problem; 
     } 
    }, ec); 

    future.onSuccess(new PrintResult<Integer>(), system.dispatcher()); 
    //#recover 
    int result = Await.result(future, Duration.create(5, SECONDS)); 
    assertEquals(result, 0); 
    } 
관련 문제