2009-08-14 11 views
7

Ben GWT ve Google App Engine kullanıyorum içinde Konu. Kayıtlarım var ve her 30 dakikada bir güncellemek istiyorum. ServiceImplben fallowing kodu vardır:GWT Google App Engine, TimerTask veya ServiceImpl atmak istisna

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

Uygulamayı çalıştırın ve zaman olsun:

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) 

ilk satırında veya yapıştırılan kodu.

Benim soru GWT + AppEngine Service çalışan bir arka plan işçi yapabilir NASIL nedir? yapabilirsiniz

cevap

3

Sen java.util.Timer kullanamazsınız. Ancak, burada anlatıldığı gibi, AppEngine Modülleri API'sının Arka Plan iş parçacığı özelliğini kullanabilirsiniz: https://developers.google.com/appengine/docs/java/modules/#Java_Background_threads

Arka plan iş parçacıklarını yalnızca elle ölçeklendirilmiş örneklerde kullanabileceğinizi unutmayın. Bu örnekte, arka plan iş parçacığı her 30 saniyede bir mesaj yazdırır, her zaman:

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(); 
0

See kullanmak değildir.

-1

konu ama genel olarak herhangi bir Servlet konteyner içinde, sadece App motorunda değildir. Bir hizmet yöntemindeyken (her zaman Servlet kabındaysanız), iş parçacığı oluşturamaz ve uyuyamazsınız. Bugünün ölçeklenebilir hizmet dünyasında

, Thread.Sleep kötü bir şey ....

+3

Bu neredeyse tamamen yanlıştır. Normal bir Servlet konteynerinde, periyodik eylemler gerçekleştiren arka plan iplikleri oluşturmak için mükemmel bir şekilde mümkün/arzu edilir. Thread.sleep öğesinin istek iş parçacığında kötü olduğunu, ancak bir arka plan iş parçacığında olmadığını söylemekte haklısınız. – Geoff

+0

Echo @Geoff'a sahip olmak zorundayım, Threads ve sleep() 'ın ölçeklenebilirlik için kötü olduğunu iddia ederek durumun tam tersi. İyi yerleştirilmiş uyku, eşzamanlılığın gücünü en üst düzeye çıkarmak için hayati önem taşımaktadır. Eğer tek iş parçacıklı ortamda çalışıyorsa , Thread.sleep() kötü bir fikirdir.Başka bir yerde çalışın ve ihtiyacınız olmadığında ve zaman uyumsuz süreçlerde beklemeniz gerektiğinde işlemci zamanından vazgeçmenin tek yolu budur. – Ajax

3

Sen efendim, AppEngine en yenice ThreadManager sınıfından yararlanabilecek olduğunu.

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

Kullanım ThreadManager.currentRequestThreadFactory() Geçerli istek tamamlandıktan kadar yakında yumurta konuları kesecektir ve ThreadManager.backgroundThreadFactory() gerçekleştirdiğiniz sürece sürecek konuları sokacak Konu fabrikası almak için lütfen (ama sadece arka planda çalışır)

Ön uç istekleri için, iş parçacığınızın takip edilmesi ve appengine'ın istek filtresinin kesilmesinden önce bitirilmesini istiyorsanız thread.join() öğesini çağırmanız önerilir. o AppEngine'de izin verilmeyen sıradan bir iş parçacığı oluşturur çünkü

+0

Arka planlar Modüller lehine önerilmemiştir; https://developers.google.com/appengine/docs/java/modules/#Java_Background_threads sayfasına bakın. –