java - 开发使用 AppEngine 数据库的 Java 应用程序

标签 java google-app-engine development-mode

这可能是一个非常微不足道的问题,但我很难找到答案:

使用 Google Plugin for Eclipse,我想开发一个普通的旧式 Java 应用程序(不是 Web 应用程序),它使用 AppEngine 进行云存储。

为此,我当然可以简单地创建两个项目,一个包含 AppEngine 服务器,另一个包含 Java 应用程序。

但我想知道是否可以在 Eclipse 中设置一个包含服务器和客户端代码的项目(如 GWT 项目)。为了执行它进行本地调试,我希望 Eclipse 启动 Tomcat 以使我的 servlet 可用,然后从项目的客户端目录启动 Main.java,就好像该项目只是一个简单的 Java 应用程序一样。这就是“Google”->“Web 应用程序”设置中“从此目录启动并部署”复选框的用途吗?如果可以,我该如何使用它?

最佳答案

我找到了一种方法,但有点俗气。

首先,将以下帮助程序类添加到项目中:

// other imports
import com.google.appengine.tools.development.DevAppServerMain;

public class DevServer {
    public static void launch(final String[] args) {
        Logger logger = Logger.getLogger("");
        logger.info("Launching AppEngine server...");
        Thread server = new Thread() {
            @Override
            public void run() {
                try {
                    DevAppServerMain.main(args);  // run DevAppServer
                } catch (Exception e) { e.printStackTrace(); }
            }
        };
        server.setDaemon(true);  // shut down server when rest of app completes
        server.start();          // run server in separate thread
        URLConnection cxn;
        try {
            cxn = new URL("http://localhost:8888").openConnection();
        } catch (IOException e) { return; }  // should never happen
        boolean running = false;
        while (!running) {  // maybe add timeout in case server fails to load
            try {
                cxn.connect();  // try to connect to server
                running = true;
                // Maybe limit rate with a Thread.sleep(...) here
            } catch (Exception e) {}
        }
        logger.info("Server running.");
    }
}

然后,将以下行添加到入口类中:

public static void main(String[] args) {
    DevServer.launch(args);  // launch AppEngine Dev Server (blocks until ready)
    // Do everything else
}

最后,创建适当的运行配置:

  • 只需单击“运行方式”->“Web 应用程序”。创建默认运行配置。
  • 在创建的运行配置中,在“主”选项卡下选择您自己的条目类作为“主类”,而不是默认的“com.google.appengine.tools.development.DevAppServerMain”。

现在,如果您启动此运行配置,它将首先启动 AppEngine 服务器,然后继续执行入口类中的 main(...) 方法的其余部分。由于服务器线程被标记为守护线程,一旦 main(...) 中的其他代码完成,应用程序将正常退出,同时关闭服务器。

不确定这是否是最优雅的解决方案,但它确实有效。如果其他人有办法在没有 DevServer 帮助器类的情况下实现此目的,请发布它!

此外,除了像上面那样使用 URL 连接对其进行 ping 操作之外,可能还有一种更优雅的方法来检查 AppEngine 服务器是否正在运行。

注意: AppEngine 开发服务器 registers its own URLStreamHandlerFactory自动映射Http(s)URLConnections进入 AppEngine 的 URL-fetch基础设施。这意味着如果您随后在客户端代码中使用 HttpURLConnections,您会收到错误消息,提示缺少 url-fetch 功能。幸运的是,这可以通过两种方式解决,如下所述:Getting a reference to Java's default http(s) URLStreamHandler .

关于java - 开发使用 AppEngine 数据库的 Java 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17744032/

相关文章:

google-app-engine - 使用 Google App Engine 时,我可以根据模式进行文本搜索吗?

java - GWT 开发模式 - 无法在 Chrome 中加载模块

java - 使用带有多对多映射的 QueryDSL JPA 编写查询

java - 严重 [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal

java - 拆分包含表情符号的字符串

java - 为什么 java 设计者强制要求 if obj1.equals(obj2) then obj1.hashCode() MUST Be == obj2.hashCode()

google-app-engine - 事务如何影响 NDB 中下一个非祖先查询的读取一致性

python - 谷歌应用引擎 : Permalink generation