下面的控制器代码包含一个Play WS GET调用,该调用在我的Mac OS X 10.9.5(Mavericks)上运行正常,但在Ubuntu 14.04(Trusty)上部署/运行时超时(TimeoutException)。我很难过为什么?
public class MzXXSimilarity implements MzYYSimilarity {
@Override
public Map<String, List<Double>> yScores(String question,
List<MzXXDocument> docs) {
// Output
final Map<String, List<Double>> scores = new HashMap<String, List<Double>>();
// Map of Score
final Multimap<String, Promise<MzXXScore>> scoreMap = HashMultimap.create();
// POST data
for (MzXXDocument doc : docs) {
WSRequestHolder holder = WS.url(MzXXConstants.XX_URL);
holder.setHeader("Authorization", MzXXConstants.XX_APIKEY);
holder.setTimeout(10000);
final ObjectNode json = Json.newObject();
json.put("text_1", doc.getData().get(MzXXFields.XX.getField()));
json.put("text_2", question);
// Fetch
Promise<MzXXScore> jsonPromise = holder.post(json).map(
new Function<WSResponse, MzXXScore>() {
public MzXXScore apply(WSResponse response) {
String text = json.get("text_1").asText();
JsonNode jsonScore = response.asJson();
double score = jsonScore.get("score").asDouble();
return new MzXXScore(text, score);
}
}
);
// Store
scoreMap.put(doc.getData().get(MzXXFields.XX_ANSWER.getField()), jsonPromise);
}
// Get the Results
Multimap<String, MzXXScore> results = HashMultimap.create();
for (Entry<String, Promise<MzXXScore>> scoreEntry : scoreMap.entries()) {
MzXXScore semScore = scoreEntry.getValue().get(30, TimeUnit.SECONDS);
results.put(scoreEntry.getKey(), semScore);
}
// Final Scores
for (String resultKey : results.keySet()) {
scores.put(resultKey, new ArrayList<Double>(results.get(resultKey)));
}
return scores;
}
在OS X Mavericks上,此代码在大约1-2秒内运行正常。在Ubuntu 14.04上,我得到以下TimeoutException:
[error] play - Cannot invoke the action, eventually got an error: java.util.concurrent.TimeoutException: Futures timed out after [30 seconds] [error] application -
! @6m2a9ldhn - Internal server error, for (POST) [/message] ->
play.api.Application$$anon$1: Execution exception[[TimeoutException: Futures timed out after [30 seconds]]]
at play.api.Application$class.handleError(Application.scala:296) ~[com.typesafe.play.play_2.11-2.3.7.jar:2.3.7]
at play.api.DefaultApplication.handleError(Application.scala:402) [com.typesafe.play.play_2.11-2.3.7.jar:2.3.7]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) [com.typesafe.play.play_2.11-2.3.7.jar:2.3.7]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) [com.typesafe.play.play_2.11-2.3.7.jar:2.3.7]
at scala.Option.map(Option.scala:145) [org.scala-lang.scala-library-2.11.1.jar:na]
Caused by: java.util.concurrent.TimeoutException: Futures timed out after [30 seconds]
at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219) [org.scala-lang.scala-library-2.11.1.jar:na]
at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:223) [org.scala-lang.scala-library-2.11.1.jar:na]
at scala.concurrent.Await$$anonfun$result$1.apply(package.scala:111) ~[org.scala-lang.scala-library-2.11.1.jar:na]
at akka.dispatch.MonitorableThreadFactory$AkkaForkJoinWorkerThread$$anon$3.block(ThreadPoolBuilder.scala:169) ~[com.typesafe.akka.akka-actor_2.11-2.3.4.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool.managedBlock(ForkJoinPool.java:3640) [org.scala-lang.scala-library-2.11.1.jar:na]
TimeoutException是由这个for循环引起的:
// Get the Results
Multimap<String, MzXXScore> results = HashMultimap.create();
for (Entry<String, Promise<MzXXScore>> scoreEntry : scoreMap.entries()) {
MzXXScore semScore = scoreEntry.getValue().get(30, TimeUnit.SECONDS);
results.put(scoreEntry.getKey(), semScore);
}
OS X Mavericks环境: 处理器:2,内存:8GB 播放版:2.3.7 Scala版本:2.11 Java版本:java版“1.8.0_25”(Java 8) Java HotSpot(TM)64位服务器VM(内置25.25-b02,混合模式)
Ubuntu 14.04环境: 处理器:2,内存:4GB 播放版:2.3.8 Scala版本:2.11 Java版本:java版“1.8.0_45”(Java 8) Java HotSpot(TM)64位服务器VM(版本25.45-b02,混合模式)
到目前为止,我尝试了以下内容:
请参阅下面的build.sbt:
name := """YYHost"""
version := "1.0-SNAPSHOT"
lazy val root = (project in file(".")).enablePlugins(PlayJava)
scalaVersion := "2.11.1"
fork in run := false
libraryDependencies ++= Seq(
javaJdbc,
javaEbean,
cache,
javaWs,
"mysql" % "mysql-connector-java" % "5.1.35"
)
我的问题是什么可能导致这种差异?为什么这个代码适用于Mavericks而不是Ubuntu?谢谢你的帮助