2015-04-06 9 views
5

Ich entwickle jetzt einen Java Google Cloud Endpunkt in GAE. Auf dem Endpunkt wird versucht, eine Verbindung zum Firebase-Server herzustellen, um Daten zu erhalten.Firebase Initialisierungsfehler in Google App Engine

Allerdings, wenn ich die Firebase Objekt in meinem Endpunkt erstellen,

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

GAE führt den folgenden Fehler:

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) 

Ich benutze Firebase Client 2.2.3. Es scheint, als ob GAE es einer Anwendung nicht erlaubt, neue Threads zu erstellen. Irgendeine Idee?

Antwort

3

@ Mario ist korrekt, App Engine App möglicherweise keine neuen Threads entsprechend der docs. Dies ist, weil die AppEngine-Anwendung in der Sandbox-Umgebung, in der Sie einige Einschränkungen haben. Wenn Sie immer noch Ihre App ohne zu entwickeln möchten Jede Einschränkung, dann würde ich vorschlagen, versuchen Managed VM, in denen Sie diese Arten von Einschränkungen nicht haben.

+1

Sie können tatsächlich Threads laufen mit einfachen oder manuelle Skalierung ohne all die Probleme zu gehen durch eine verwaltete VM zu setzen, ist die einzige Beschränkung für die automatische Skalierung: https://cloud.google.com/appengine/docs/ java/modules/# Java_Background_threads –

4

In der Java-Laufzeitumgebung für Google App Engine gibt es einige Einschränkungen beim Erstellen neuer Threads.

Weitere Informationen finden Sie unter the Threads section.

-3

Ich denke this Link wird Ihnen helfen, es beschreibt, wie wir Firebase-Echtzeit-Datenbank von Server-Anwendung mit Service-Konto verwenden können.

Sie können das folgende Code-Snippet verwenden, um eine Verbindung zur Firebase-Datenbank herzustellen.

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

Damit wird die Frage nicht beantwortet. Der obige Code wird genauso fehlschlagen wie der ursprüngliche Post. –

+0

Hallo @AaronSarazan, Ich habe es vor dem Posten getestet und arbeitete, wenn Sie irgendwelche Fehler konfrontiert sind, bitte posten Sie das hier. –