2009-08-14 24 views
7

我正在使用GWT和Google App Engine。我有一些記錄,我想每30分鐘更新一次。 在ServiceImpl我有休耕代碼:GWT,Google App Engine,TimerTask或ServiceImpl中的線程拋出異常

new Timer().schedule(new TimerTask(){ 
    @Override 
    public void run() { 
     try { 
      Thread.sleep(30000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     result = updateFeeds(); 
    } 
}, 30000,Long.MAX_VALUE); 

當我運行應用程序,當我得到:

com.google.gwt.user.server.rpc.UnexpectedException: 
Service method 'public abstract java.util.List org.joke.planet.client.FeedService.loadFeeds()' threw an unexpected exception: 
java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThreadGroup) 

在第一行或粘貼代碼。

我的問題是如何讓一個後臺工作者在GWT + AppEngine服務中工作?

回答

3

您不能使用java.util.Timer,因爲它創建了一個普通的線程,這是AppEngine不允許的。但是,您可以使用AppEngine上模塊API的後臺線程設施,如記錄在這裏: https://developers.google.com/appengine/docs/java/modules/#Java_Background_threads

請注意,您只能在手動縮放實例使用後臺線程。在這個例子中,後臺線程每隔30秒打印一條消息,永遠:

Thread thread = ThreadManager.createBackgroundThread(new Runnable() { 
    public void run() { 
    try { 
     while (true) { 
     System.err.println("Doing something!"); 
     Thread.sleep(30_000); 
     } 
    } catch (InterruptedException ex) { 
    } 
    } 
}); 
thread.start(); 
-1

這個問題不只是在App引擎中,而是一般在任何Servlet容器中。當一個人在服務方法中(你總是在Servlet容器中)時,你不能創建線程並進行睡眠。

在今天的可擴展的服務世界,Thread.sleep代碼是一件壞事....

+3

這幾乎是完全錯誤的。在一個普通的Servlet容器中,創建執行定期操作的後臺線程是完全可能的/需要的。你說在請求線程中Thread.sleep不好,但不在後臺線程中是正確的。 – Geoff 2010-06-04 11:43:55

+0

我必須回聲@Geoff,聲稱線程和睡眠()對可伸縮性不利是相反的情況。良好的睡眠對於最大化併發能力至關重要。 如果您正在單線程環境中運行,Thread.sleep()是一個壞主意。在其他任何地方運行,這是在不需要它的時候放棄cpu時間的唯一方法,並且需要等待異步進程。 – Ajax 2012-06-28 13:21:27

3

你,先生,可以從AppEngine上的新望ThreadManager類受益。

https://developers.google.com/appengine/docs/java/backends/overview#background_threads

使用ThreadManager.currentRequestThreadFactory()來獲得一個線程工廠,將盡快中斷產生的線程作爲當前請求完成,並ThreadManager.backgroundThreadFactory()來派生線程將持續,只要你請(但只適用於後端)

對於前端請求,建議跟蹤您的線程,如果您希望它們在appengine的請求過濾器中斷它們之前完成,請調用thread.join()。

+0

後端已被棄用,以支持模塊;請參閱https://developers.google.com/appengine/docs/java/modules/#Java_Background_threads。 – 2014-06-18 19:18:11