Playframework 2.0 如何处理AskTimeoutException?

Playframework 2.0 如何处理AskTimeoutException?,playframework-2.0,Playframework 2.0,我正试着打电话给一个演员做一些耗时的事情。 呼叫方将计时器设置为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"); } })); 返回a

我正试着打电话给一个演员做一些耗时的事情。 呼叫方将计时器设置为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");
}
}));
返回async(Akka.asPromise(ask(myActor,“hello”,uploadImageTimeout)).map(新函数(){
@凌驾
公共结果应用(对象响应){
返回ok(“完成”);
}
}));

您可以做的一件事是从阿克卡未来内部的异常中“恢复”:

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));
        }
    }
}));
返回异步(Akka.asPromise(ask(myActor,“hello”,uploadImageTimeout)。恢复(
新恢复(){
@凌驾
公共对象恢复(Throwable t)抛出Throwable{
if(AskTimeoutException的t实例){
Logger.error(“获取异常:”,t);
返回internalServerError(“超时”);
}
否则{
Logger.error(“获取异常:”,t);
返回internalServerError(“获取异常:+t.getMessage());
}
}
})
).map(新函数(){
@凌驾
公共结果应用(对象响应){
if(结果的响应实例){
//结果对象由上面的恢复处理程序返回
返回(结果)响应;
}
否则{
返回ok(doSomethingWithResponse(response));
}
}
}));
使用Play 2.2.1(和Akka 2.2)需要对解决方案进行细微更改。源代码测试是找到响应的最佳站点。我在这里找到了我的

@测试
public void useRecover()引发异常{
//#恢复
final ExecutionContext ec=system.dispatcher();
Future=Future(新的可调用(){
公共整数调用(){
返回1/0;
}
},ec)。恢复(新恢复(){
公共整数恢复(可丢弃问题)抛出可丢弃的{
if(算术异常的问题实例)
返回0;
其他的
投掷问题;
}
},欧共体);
future.onSuccess(新的PrintResult(),system.dispatcher());
//#恢复
int result=Await.result(未来、持续时间、创建(5秒));
assertEquals(结果为0);
}

尝试在Play 2.2.1中使用新的恢复不起作用。似乎recover需要PartialFunction对象,我没有找到任何示例
 @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);
  }