自从更新到Mac OS X Mavericks以来,我在使用maven插件启动Google Appengine Devserver时遇到了一些严重的延迟。以下是日志文件的片段:
1: Okt 26, 2013 10:46:16 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
2: INFO: Successfully processed /Users/Me/workspace/example/target/example-0.1-SNAPSHOT/WEB-INF/appengine-web.xml
3: [INFO] Running /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/jre/bin/java -XstartOnFirstThread -javaagent:/Users/Me/.m2/repository/com/google/appengine/appengine-java-sdk/1.8.6/appengine-java-sdk/appengine-java-sdk-1.8.6/lib/agent/appengine-agent.jar -Xbootclasspath/p:/Users/Me/.m2/repository/com/google/appengine/appengine-java-sdk/1.8.6/appengine-java-sdk/appengine-java-sdk-1.8.6/lib/override/appengine-dev-jdk-overrides.jar -Dappengine.fullscan.seconds=5 -classpath /Users/Me/.m2/repository/com/google/appengine/appengine-java-sdk/1.8.6/appengine-java-sdk/appengine-java-sdk-1.8.6/lib/appengine-tools-api.jar com.google.appengine.tools.development.DevAppServerMain --allow_remote_shutdown -a 0.0.0.0 /Users/Me/workspace/example/target/example-0.1-SNAPSHOT
4: [INFO] objc[897]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/jre/bin/java and /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.
5: [INFO] Okt 26, 2013 10:47:34 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
比较此示例中第1行和第5行的时间戳(当然,实际日志要长得多)。差异是78秒!几乎所有这些时间都在第3行消耗。
在这里,为了更好的可读性,我再次第3行:
[INFO]正在运行/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/jre/bin/java -XstartOnFirstThread -javaagent:/Users/Me/.m2/repository/com/google/appengine /appengine-java-sdk/1.8.6/appengine-java-sdk/appengine-java-sdk-1.8.6/lib/agent/appengine-agent.jar -Xbootclasspath / p:/Users/Me/.m2/repository /com/google/appengine/appengine-java-sdk/1.8.6/appengine-java-sdk/appengine-java-sdk-1.8.6/lib/override/appengine-dev-jdk-overrides.jar -Dappengine.fullscan .seconds = 5 -classpath /Users/Me/.m2/repository/com/google/appengine/appengine-java-sdk/1.8.6/appengine-java-sdk/appengine-java-sdk-1.8.6/lib/ appengine-tools-api.jar com.google.appengine.tools.development.DevAppServerMain --allow_remote_shutdown -a 0.0.0.0 /Users/Me/workspace/example/target/example-0.1-SNAPSHOT
我猜,第4行与此问题无关,它是something different,应该在1.7.0u60中修复。
有没有人有线索,这里可能有什么问题?
我怀疑它与WiFi问题有关,但即使禁用WiFi和局域网(这是一台带有以太网端口的“旧”MacBook Pro),我也会遇到同样的问题。
[编辑]当我直接在终端中执行第3行中的命令时,没有延迟。但是对于maven,有一个延迟。我试过多次,反之亦然......
答案 0 :(得分:0)
AbstractDevAppServerMojo
中。
原因是,这对我来说是新的 - 插件首先尝试停止正在运行的开发服务器。这是在这种方法中实现的:
protected void stopDevAppServer() throws MojoExecutionException {
HttpURLConnection connection = null;
try {
Integer port = firstNonNull(this.port, 8080);
URL url = new URL("http", firstNonNull(address, "localhost"), port, "/_ah/admin/quit");
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.getOutputStream().write(0); // <-- Problem is here!
ByteStreams.toByteArray(connection.getInputStream());
connection.disconnect();
getLog().warn("Shutting down devappserver on port " + port);
Thread.sleep(2000);
} catch (MalformedURLException e) {
throw new MojoExecutionException("URL malformed attempting to stop the devserver : " + e.getMessage());
} catch (IOException e) {
getLog().debug("Was not able to contact the devappserver to shut it down. Most likely this is due to it simply not running anymore. ", e);
} catch (InterruptedException e) {
Throwables.propagate(e);
}
}
仅在开发服务器未运行时才会出现问题。在这种情况下,URL不存在,HttpUrlConnection
等待超时。
解决方法是更改连接超时持续时间。例如,将其设置为1秒:
connection.setRequestMethod("POST");
connection.setConnectTimeout(1000);
connection.getOutputStream().write(0);
这适用于我,它也适用于其他人,因为开发服务器通常在同一台机器上运行。 它也可以作为配置参数实现。
所以,它与Mavericks无关(抱歉怀疑你,Apple),但是使用Maven插件本身。或者也许在小牛队中以某种方式改变了超时持续时间。
我对这个问题的解决方案?它只发生一次,否则开发服务器会自动运行并被插件停止。这对我来说已经足够了。
[编辑]为Maven插件创建issue。