Как обрабатывать AskTimeoutException? - PullRequest
2 голосов
/ 23 марта 2012

Я пытаюсь вызвать актера, чтобы он занял много времени. Звонящий установил таймер на 5 сек. Но я не могу обработать исключение тайм-аута с помощью try / catch.

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

Ответы [ 2 ]

3 голосов
/ 09 апреля 2012

Одна вещь, которую вы можете сделать, это «восстановиться» от исключения прямо в будущем 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 голосов
/ 04 марта 2014

Использование Play 2.2.1 (и Akka 2.2) требует незначительных изменений в решении.Тестирование исходного кода - лучший сайт для поиска ответов.Я нашел мой здесь 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);
  }
...