【问题标题】:Developing a Java Application that uses an AppEngine database开发使用 AppEngine 数据库的 Java 应用程序
【发布时间】:2013-07-18 14:49:31
【问题描述】:

这可能是一个非常琐碎的问题,但我很难找到答案:

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

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

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

【问题讨论】:

  • 你说它不是你要找的网络应用?
  • @Rakesh 正确。我正在编写一个常规的旧 Java 应用程序,它使用 Url 连接来访问 AppEngine 提供的数据库。任何地方都不涉及网络浏览器。
  • 您是否特别需要使用 AppEngine 或任何数据库都可以?
  • @Rakesh 我绝对想使用 AppEngine。

标签: java google-app-engine development-mode


【解决方案1】:

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

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

// 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 助手类的情况下实现此目的,请发布!

此外,可能还有一种更优雅的方法来检查 AppEngine 服务器是否正在运行,而不是像我上面那样使用 URL 连接 ping 它。

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

【讨论】:

  • 看起来不错!可能你应该在 while 循环中引入一些延迟,而不是连续 ping。
  • 我认为connect() 方法中已经存在某种超时。至少如果我检查进一步的日志消息,while 循环似乎在退出之前只执行了大约 4 或 5 次,即使加载服务器需要几秒钟。但总的来说,当然,你是对的。而且,也许在另一台机器上它的行为会有所不同。我将在代码中添加注释。
【解决方案2】:

如果您确实想使用 appengine,那么您最终会创建两个项目,一个在 appengine 上,另一个是独立的(无 servlet)。这种情况你可以看看appengine Remote API

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多