播放2.3.8 - 为什么Ubuntu 14.04上有TimeoutException但Mac OS X 10.9.5上没有?

时间:2015-04-30 16:25:06

标签: java linux macos ubuntu playframework

下面的控制器代码包含一个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,混合模式)

到目前为止,我尝试了以下内容:

  1. 在dev和prod模式下运行ubuntu和mavericks实例,但我仍然只在ubuntu上获得超时异常
  2. 在ubuntu上将超时时间增加到100秒,但仍然会出现超时异常
  3. 在ubuntu实例的build.sbt中运行run:= false更改fork并仍然获得超时异常
  4. htop在ubuntu机器上显示290/3829 MB内存使用情况,因此RAM似乎不是问题?
  5. 不,我在两种情况下都没有使用代理。
  6. 在ubuntu机器上的命令行上使用curl,使用与播放WS“gets”相同的URL工作正常,因此它看起来不像网络/防火墙问题
  7. 请参阅下面的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?谢谢你的帮助

0 个答案:

没有答案