PlayFramework 2.1 JAVA中的承诺超时和WS.get超时

PlayFramework 2.1 JAVA中的承诺超时和WS.get超时,java,playframework,playframework-2.0,promise,Java,Playframework,Playframework 2.0,Promise,我正在尝试使用WS-on-Play Framework 2.1和JAVA api访问URL 以下是我想要的: 在代码中的某些地方,使用WS.get()启动WS-request(我设置超时1000ms) 如果WS.get超时或发生另一个异常,我不希望我的承诺抛出异常(因为我的流要求这样),因此我使用Promise.recover()将该承诺与另一个承诺包装在一起。如果出现故障,它将返回一个nullresponse对象 我想在代码中的其他地方“获取”我的响应。我等待5000ms,但我得到的是java

我正在尝试使用WS-on-Play Framework 2.1和JAVA api访问URL

以下是我想要的:

  • 在代码中的某些地方,使用
    WS.get()
    启动WS-request(我设置超时1000ms
  • 如果WS.get超时或发生另一个异常,我不希望我的承诺抛出异常(因为我的流要求这样),因此我使用
    Promise.recover()
    将该承诺与另一个承诺包装在一起。如果出现故障,它将返回一个
    null
    response对象
  • 我想在代码中的其他地方“获取”我的响应。我等待5000ms,但我得到的是
    java.util.concurrent.TimeoutException:Futures在[5000毫秒]后超时
  • 如何执行?
    WS.get()
    1000ms之后超时,由于它抛出一个
    java.util.concurrent.TimeoutException:在1000
    之后没有收到响应,因此我的恢复函数会捕获它。它返回空响应,而不是异常

    所以承诺最多在1000毫秒后“完成”为什么在5000毫秒后超时并抛出异常?

    代码:


    即使我等待promise2,promise2也是“recover wrapped promise1”,在抛出异常后恢复函数也会运行。

    setTimeout()设置连接超时。因此,可能是您的服务器正在响应,但下载文件的时间超过5秒?@Fabian setTimeout也会设置请求超时:1000毫秒后,由于请求超时,它会引发超时异常。(或者我有严重的错误,这是可能的。)但是
    recover()
    不能“处理”它。我为这个问题添加了一些输出。
        Logger.info("Fetch started: " + new Date().toString());
    Promise<WS.Response> p1 = WS.url("http://athena.ics.forth.gr:9090/RDF/VRP/Examples/tap.rdf").setTimeout(1000).get();
    Promise<WS.Response> p2 = p1.recover(new Function<Throwable, WS.Response>() { 
      @Override
      public Response apply(Throwable a) throws Throwable {
        Logger.error("Promise thrown an exception so I will return null. " + new Date().toString() + " " + System.currentTimeMillis(), a);
        return null;
      }
    });
    
    try {
      /* This should return null or valid response but shouldn't throw an exception */
      Response r = p2.get(5000L);
      Logger.info(r.toString());
    } catch (Exception e) {
      /* Sholdn't happen! */
      Logger.error("Outer exception: " + " " + System.currentTimeMillis(), e);
    }
    Logger.error("Fetch finished: " + new Date().toString() + " " + System.currentTimeMillis());
    
    [info] application - Fetch started: Tue Mar 19 10:04:42 EET 2013
    [error] application - Outer exception:  1363680287626
    java.util.concurrent.TimeoutException: Futures timed out after [5000 milliseconds]
        at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:96) ~[scala-library.jar:na]
        at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:58) ~[scala-library.jar:na]
        at scala.concurrent.Await$$anonfun$ready$1.apply(package.scala:86) ~[scala-library.jar:na]
        at scala.concurrent.Await$$anonfun$ready$1.apply(package.scala:86) ~[scala-library.jar:na]
        at akka.dispatch.MonitorableThreadFactory$AkkaForkJoinWorkerThread$$anon$3.block(ThreadPoolBuilder.scala:173) ~[akka-actor_2.10.jar:na]
        at scala.concurrent.forkjoin.ForkJoinPool.managedBlock(ForkJoinPool.java:2803) [scala-library.jar:na]
    [error] application - Fetch finished: Tue Mar 19 10:04:47 EET 2013 1363680287627
    [error] application - Promise thrown an exception so I will return null. Tue Mar 19 10:04:47 EET 2013 1363680287627
    java.util.concurrent.TimeoutException: No response received after 1000
        at com.ning.http.client.providers.netty.NettyAsyncHttpProvider$ReaperFuture.run(NettyAsyncHttpProvider.java:1809) ~[async-http-client.jar:na]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) ~[na:1.7.0_11]
        at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351) ~[na:1.7.0_11]
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178) ~[na:1.7.0_11]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178) ~[na:1.7.0_11]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) ~[na:1.7.0_11]