2013-07-19 25 views
0

這可能是一個很瑣碎的問題Java應用程序,但我無法找到答案:開發使用的AppEngine上的數據庫

使用谷歌Eclipse插件,我想開發一個普通的舊式Java應用程序(而不是Web應用程序),它使用AppEngine進行雲存儲。

爲此,我當然可以簡單地創建兩個項目,一個包含AppEngine服務器,另一個包含Java應用程序。

但我想知道是否有可能在Eclipse中設置包含服務器和客戶端代碼(如GWT項目)的單個項目。爲了執行本地調試,我想讓Eclipse啓動Tomcat來使我的servlet可用,然後從項目的客戶端目錄啓動我的Main.java,就好像項目只是一個簡單的Java應用程序一樣。這是「從這個目錄啓動和部署」複選框是用於「Google」 - >「Web應用程序」設置?如果是這樣,我該如何使用它?

+0

你說這不是一個你正在尋找的網絡應用程序? – Rakesh

+0

@Rakesh正確。我正在編寫一個使用Url連接訪問AppEngine提供的數據庫的常規Java應用程序。沒有任何地方涉及網絡瀏覽器。 –

+0

您是否特別需要使用AppEngine或任何數據庫都可以做到? – Rakesh

回答

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應用程序」。創建默認運行配置。
  • 在創建運行配置,「主」 -Tab選擇自己的入門級「主類」,而不是默認的「com.google.appengine.tools.development.DevAppServerMain」下。現在

,如果你推出這個運行配置,它會首先彈出的AppEngine服務器,然後使用在入門級的main(...)方法的其餘部分繼續。由於服務器線程被標記爲守護程序線程,因此一旦main(...)中的其他代碼完成,應用程序就會正常退出,同時關閉服務器。

不知道這是最優雅的解決方案,但它的工作原理。如果其他人有辦法在沒有DevServer輔助班的情況下達到此目的,請張貼它!

而且,有可能是檢查的AppEngine服務器是否正在運行,除了與一個URL連接偵測它就像我上面做了一個更優雅的方式。

注:的AppEngine上開發服務器registers its own URLStreamHandlerFactory自動映射到Http(s)URLConnections的AppEngine的URL-fetch基礎設施。這意味着如果您在客戶端代碼中使用HttpURLConnections,則會出現抱怨缺少url抓取功能的錯誤。幸運的是,這可以通過兩種方式解決:Getting a reference to Java's default http(s) URLStreamHandler

+0

看起來不錯!也許你應該在while循環中引入一些延遲,而不是持續ping。 – Rakesh

+0

我想''connect()'方法中已經有某種超時了。至少如果我檢查進一步的日誌消息,while循環在退出前似乎只執行大約4或5次,即使加載服務器需要幾秒鐘時間。但總的來說,你當然是對的。而且,也許在另一臺機器上它的行爲會有所不同。我會爲代碼添加註釋。 –

0

如果你一定要使用appengine,那麼你最終會創建兩個項目,一個用於appengine,另一個用於獨立(沒有servlet)。在這種情況下,你可以看看appengine Remote API

+0

我找到了一種方法來做到這一點(請參閱我的回答),但我不確定它是最乾淨的... –