2015-04-06 5 views
5

Attualmente sto sviluppando un endpoint cloud Google java in GAE. All'interno dell'endpoint proverà a connettersi al server Firebase per ottenere alcuni dati.Errore di avvio di Firebase in Google App Engine

Tuttavia, quando creo l'oggetto Firebase nel mio endpoint,

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

GAE getta il seguente errore:

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) 

Sto usando Firebase cliente 2.2.3. Sembra che GAE non consenta a un'applicazione di creare nuovi thread. Qualche idea?

risposta

3

@ Mario è corretto, l'applicazione App Engine potrebbe non generare nuovi thread in base allo docs. Questo perché l'applicazione AppEngine viene eseguita nell'ambiente sandbox in cui si hanno alcune restrizioni. Se si desidera continuare a sviluppare l'app senza qualsiasi restrizione quindi suggerirei di provare Managed VM in cui non si dispone di questi tipi di restrizioni.

+1

Si può effettivamente eseguire le discussioni con il ridimensionamento di base o manuale senza passare attraverso tutti i problemi di impostazione di una macchina virtuale gestita, l'unica limitazione è in scala automatica: https://cloud.google.com/appengine/docs/ java/modules/# Java_Background_threads –

4

Nel runtime Java per Google App Engine ci sono alcune restrizioni sulla creazione di nuovi thread.

Per ulteriori dettagli, vedere the Threads section.

-3

Penso che il collegamento this ti aiuterà, descrive come possiamo utilizzare il database in tempo reale di Firebase dall'applicazione server utilizzando l'account di servizio.

È possibile utilizzare il seguente snippet di codice per connettersi al database 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

Questo non fa nulla per rispondere alla domanda dichiarata. Il codice sopra riportato fallirà esattamente nello stesso modo del post originale. –

+0

Ciao @AaronSarazan, l'ho provato prima di postare e stava funzionando, se si riscontrano errori si prega di postare qui. –