【问题标题】:Delay when starting Google Appengine devserver with Maven plugin on Mac OS X Mavericks在 Mac OS X Mavericks 上使用 Maven 插件启动 Google Appengine 开发服务器时出现延迟
【发布时间】:2013-10-26 21:00:58
【问题描述】:

自从更新到 Mac OS X Mavericks 后,我在使用 maven 插件启动 Google Appengine Devserver 时遇到了一些严重的延迟。这是日志文件中的一个 sn-p:

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 并在 LAN 上(它是带有以太网端口的“旧”MacBook Pro),我也会遇到同样的问题。

[编辑] 当我直接在终端执行第 3 行的命令时,没有延迟。但是对于 Maven,有一个延迟。我尝试了多次一种方法......

【问题讨论】:

    标签: java macos google-app-engine maven osx-mavericks


    【解决方案1】:

    好的,我找到了罪魁祸首。它在 Appengine Maven 插件类 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 插件本身有关。或者,在 Mavericks 中,超时持续时间可能有所改变。

    我对这个问题的解决方案?它只发生一次,否则开发服务器会运行并被插件自动停止。现在对我来说已经足够了。

    [编辑] 为 Maven 插件创建了一个issue

    【讨论】:

    • 我知道这已经 1 岁了,但你能告诉我你正在运行哪个目标,这会导致插件自动停止正在运行的服务器吗?当我使用已经运行的服务器运行 appengine:devserver 目标时,我得到 bind failed: Address already in use 并且它在启动时仍在等待 > 60 秒。
    • 对于遇到此问题的其他人,我发现我可以通过注释掉 &lt;address&gt;0.0.0.0&lt;/address&gt; 或禁用我的 (OS X) 防火墙来避免它。
    猜你喜欢
    • 1970-01-01
    • 2013-11-28
    • 2011-07-16
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多