Разработка приложения Java, использующего базу данных AppEngine

Это может быть очень тривиальный вопрос, но я не могу найти ответ:

Используя плагин Google для Eclipse, я хотел бы разработать простое старое Java-приложение (не веб-приложение), которое использует AppEngine для облачного хранилища.

Для этого я, конечно, мог бы просто создать два проекта, один из которых содержал сервер AppEngine, а другой - приложение Java.

Но мне интересно, возможно ли создать в Eclipse один проект, содержащий как серверный, так и клиентский код (как для проекта GWT). Чтобы выполнить его для локальной отладки, я бы хотел, чтобы Eclipse запустил Tomcat, чтобы сделать мои сервлеты доступными, а затем запустил мой Main.java из клиентского каталога проекта, как если бы проект был простым Java-приложением. Для этого установлен флажок "Запуск и развертывание из этого каталога" в настройках "Google" -> "Веб-приложение"? Если да, то как мне его использовать?

2 ответа

Решение

Я нашел один способ сделать это, но это немного глупо.

Сначала добавьте в проект следующий вспомогательный класс:

// 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
}

Наконец, создайте соответствующую конфигурацию запуска:

  • Просто нажмите "Запуск от имени" -> "Веб-приложение". Чтобы создать конфигурацию запуска по умолчанию.
  • В созданной Конфигурации запуска в разделе "Основной" выберите свой собственный класс записи в качестве "Основного класса" вместо стандартного "com.google.appengine.tools.development.DevAppServerMain".

Теперь, если вы запустите эту конфигурацию запуска, она сначала запустит сервер AppEngine, а затем продолжит работу с остальными main(...) метод в классе входа. Поскольку поток сервера помечен как поток демона, один раз другой код в main(...) После завершения приложение завершает свою работу нормально, также отключая сервер.

Не уверен, что это самое элегантное решение, но оно работает. Если у кого-то есть способ достичь этого без DevServer хелпер-класс, пожалуйста, напишите об этом!

Кроме того, может быть более элегантный способ проверить, работает ли сервер AppEngine, кроме проверки связи с URL-соединением, как я делал выше.

Примечание. Сервер AppEngine Dev регистрирует свой собственный URLStreamHandlerFactory автоматически отображать Http(s)URLConnections на инфраструктуру получения URL в AppEngine. Это означает, что вы получаете ошибки с жалобами на отсутствие возможности url-fetch, если вы затем используете HttpURLConnections в коде вашего клиента. К счастью, это можно исправить двумя способами, как описано здесь: Получение ссылки на http(s) по умолчанию http(s) Java URLStreamHandler.

Если вы определенно хотите использовать appengine, то в итоге вы создадите два проекта, один для appengine, а другой - автономный (без сервлетов). В этом случае вы можете взглянуть на appengine Remote API

Другие вопросы по тегам