2015-04-06 17 views
5

Obecnie rozwijam punkt końcowy Chmury Google w java w GAE. Wewnątrz punktu końcowego spróbuje połączyć się z serwerem Firebase, aby uzyskać dane.Błąd inicjacji Firebase w Google App Engine

Jednak, kiedy utworzyć Firebase obiekt w moim końcowego,

Firebase ref = new Firebase(<My Firebase URL>); 

GAE wyrzuca następujący błąd:

java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup") 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:382) 
    at java.security.AccessController.checkPermission(AccessController.java:572) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 
    at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315) 
    at java.lang.Thread.init(Thread.java:391) 
    at java.lang.Thread.init(Thread.java:349) 
    at java.lang.Thread.<init>(Thread.java:675) 
    at java.util.concurrent.Executors$DefaultThreadFactory.newThread(Executors.java:572) 
    at com.firebase.client.utilities.DefaultRunLoop$FirebaseThreadFactory.newThread(DefaultRunLoop.java:25) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.<init>(ThreadPoolExecutor.java:600) 
    at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:943) 
    at java.util.concurrent.ThreadPoolExecutor.ensurePrestart(ThreadPoolExecutor.java:1635) 
    at java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(ScheduledThreadPoolExecutor.java:307) 
    at java.util.concurrent.ScheduledThreadPoolExecutor.schedule(ScheduledThreadPoolExecutor.java:526) 
    at java.util.concurrent.ScheduledThreadPoolExecutor.execute(ScheduledThreadPoolExecutor.java:615) 
    at com.firebase.client.utilities.DefaultRunLoop.scheduleNow(DefaultRunLoop.java:57) 
    at com.firebase.client.core.Repo.scheduleNow(Repo.java:176) 
    at com.firebase.client.core.Repo.<init>(Repo.java:58) 
    at com.firebase.client.core.RepoManager.getLocalRepo(RepoManager.java:46) 
    at com.firebase.client.core.RepoManager.getRepo(RepoManager.java:19) 
    at com.firebase.client.Firebase.<init>(Firebase.java:194) 
    at com.firebase.client.Firebase.<init>(Firebase.java:199) 
    at com.firebase.client.Firebase.<init>(Firebase.java:177) 

Używam Firebase klienta 2.2.3. Wygląda na to, że GAE nie zezwala aplikacji na tworzenie nowych wątków. Dowolny pomysł?

Odpowiedz

3

@ Mario jest poprawny, aplikacja App Engine może nie odradzać nowych wątków zgodnie z docs. Dzieje się tak dlatego, że aplikacja AppEngine działa w środowisku piaskownicy, w którym masz pewne ograniczenia.Jeśli nadal chcesz rozwijać swoją aplikację bez Wszelkie ograniczenia, to proponuję wypróbować Managed VM, w którym nie masz tego typu ograniczeń.

+1

Rzeczywiście można uruchomić wątki za pomocą skalowania podstawową lub ręcznego, bez przechodzenia przez wszystkich kłopotów ustalania zarządzanego VM, jedynym ograniczeniem jest na automatycznym skalowaniem: https://cloud.google.com/appengine/docs/ java/modules/# Java_Background_threads –

4

W środowisku wykonawczym Java dla Google App Engine istnieją pewne ograniczenia dotyczące tworzenia nowych wątków.

Aby uzyskać szczegółowe informacje, patrz: the Threads section.

-3

Myślę, że link: this pomoże ci, opisuje, jak możemy użyć bazy danych czasu rzeczywistego firebase z aplikacji serwera za pomocą konta usługi.

Możesz użyć następującego fragmentu kodu, aby połączyć się z bazą danych Firebase.

// Initialize the app with a service account, granting admin privileges 
FirebaseOptions options = new FirebaseOptions.Builder() 
    .setDatabaseUrl("https://databaseName.firebaseio.com") 
    .setServiceAccount(new FileInputStream("path/to/serviceAccountCredentials.json")) 
    .build(); 
FirebaseApp.initializeApp(options); 

// As an admin, the app has access to read and write all data, regardless of Security Rules 
DatabaseReference ref = FirebaseDatabase 
    .getInstance() 
    .getReference("restricted_access/secret_document"); 
ref.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     Object document = dataSnapshot.getValue(); 
     System.out.println(document); 
    } 
}); 
+1

Nie robi to nic, aby rozwiązać zadane pytanie. Powyższy kod nie powiedzie się dokładnie tak samo jak oryginalny post. –

+0

Witam @AaronSarazan, testowałem to przed wysłaniem i działało, jeśli napotykasz jakiś błąd, opublikuj to tutaj. –