Promise and WS.get Timeout timeouts in PlayFramework 2.1 JAVA

I am trying to access the URL using WS on Play Framework 2.1 using the JAVA api.

Here is what I want:

  • Some where in the code, run a WS request using WS.get()(I set a timeout of 1000 ms )
  • If the runtime is WS.get or another exception, I don't want my Promise to throw an exception (since my thread requires this). Therefore, I use Promise.recover()to wrap this promise with others. What the nullReponse object returns in case of failure.
  • Somewhere else in the code, I want to “get” my answer. I'm waiting for 5000 ms , but I getjava.util.concurrent.TimeoutException: Futures timed out after [5000 milliseconds]

How? WS.get()timesout after 1000 ms , and since it throws java.util.concurrent.TimeoutException: No response received after 1000, it is caught by my restore function. It returns a null response instead of an exception.

So the promise is "completed" after 1000 ms. Why does this time expire and throw an exception after 5000 ms?

the code:

    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());

Conclusion:

[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]

Even I wait for promise2, and promise2 - "restore the wrapped promise1", the restore function starts AFTER the exception that is selected.

+5
source share

All Articles