java - 在 Mac OS X Mavericks 上使用 Maven 插件启动 Google Appengine devserver 时出现延迟

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

自从更新到 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] 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 行与这个问题无关,它是 something different应该在 1.7.0u60 中修复。

有人知道这里可能出了什么问题吗?

我怀疑这与 WiFi 问题有关,但即使禁用了 WiFi 并在 LAN 上(它是带有以太网端口的“旧”MacBook Pro),我也遇到了同样的问题。

[编辑] 当我直接在终端中执行第 3 行命令时,没有延迟。但对于maven来说,有延迟。我尝试了多次,一种方式,另一种方式......

最佳答案

好的,我找到了罪魁祸首。它位于 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 中的超时持续时间已被更改。

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

[编辑]创建了 issue用于 Maven 插件。

关于java - 在 Mac OS X Mavericks 上使用 Maven 插件启动 Google Appengine devserver 时出现延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19611848/

相关文章:

macos - 听 TCP 127.0.4.1 :2040: bind: can't assign requested address

python - Nose / Nose : Import problems

Java EntityManager 合并和 @PrePersist

java - 在 JUnit 中测试 CharSequences 是否相等

cocoa - 如何获取通过 Active Directory 登录 Mac 的用户的域名

java - 这可以工作吗 - 由打包到一个 Mac 桌面应用程序中的 Java 后端提供的 Objective-C UI?

java - Spring MVC/Rest 中嵌入的 React 应用程序 : browser GET request routing

java - 为什么 ArrayList<E> 构造函数允许原始 ArrayList 参数

google-app-engine - F4_1G 是否属于 google app engine free Tier?

google-app-engine - App Engine 批量加载程序下载警告 "No descending index on __key__, performing serial download"