5

JAVA api を使用して Play Framework 2.1 で WS を使用して URL にアクセスしようとしています。

ここに私が欲しいものがあります:

  1. WS.get()コードのどこかで、 (タイムアウトを1000msに設定)を使用して WS リクエストを開始します。
  2. WS.get がタイムアウトするか、別の例外が発生した場合、Promise で例外をスローしたくありません (私のフローではそのようにする必要があるため) Promise.recover()null失敗した場合に Reponse オブジェクトを返します。
  3. 応答を「取得」したいコードの他の場所。5000ミリ秒待ちますが、得られるのはjava.util.concurrent.TimeoutException: Futures timed out after [5000 milliseconds]

どのように? WS.get()1000ミリ秒後にタイムアウトしそれがスローjava.util.concurrent.TimeoutException: No response received after 1000されるため、回復機能によってキャッチされます。例外ではなく null 応答を返します。

したがって、promise は最大で 1000ms 後に「完了」します。タイムアウトして 5000 ミリ秒後に例外がスローされるのはなぜですか?

コード:

    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]

promise2 を待っていても、promise2 は「ラップされた promise1 を回復する」であり、例外がスローされた後に回復機能が実行されます。

4

0 に答える 0