6

Nel mio api esploratore vengo seguente errore durante l'esecuzione di un inserto di un endpoint, che inserisce alcuni dati a Firebase.java.lang.IllegalStateException: Questa funzione è disponibile solo per i casi di backend

503 

- Show headers - 

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "backendError", 
    "message": "java.lang.IllegalStateException: This feature is only available to backend instances." 
    } 
    ], 
    "code": 503, 
    "message": "java.lang.IllegalStateException: This feature is only available to backend instances." 
} 
} 

Inoltre sto usando seguente codice all'interno di una classe endpoint dove Firebase è un riferimento oggetto statico.

FirebaseOptions options = new FirebaseOptions.Builder() 
     .setServiceAccount(servletContext.getResourceAsStream("/WEB-INF/google-services.json")) 
     .setDatabaseUrl("https://contactifyapp.firebaseio.com/") 
     .build(); 

if (firebaseApp == null) 
    firebaseApp = 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(); 
String data = runMeNow.getData(); 
JSONObject jsonObject = new JSONObject(data); 
Random rand = new Random(); 
ref.child(Keys.CONTACT_INFO).child("child").child(Keys.USER_INFO).setValue(jsonObject.get(Keys.USER_INFO)); 

I registri sono le seguenti sul server:

19:30:43.061 
com.google.api.server.spi.SystemService invokeServiceMethod: exception occurred while calling backend method 
java.lang.IllegalStateException: This feature is only available to backend instances. 
    at com.google.appengine.api.system.SystemServiceImpl.translateException(SystemServiceImpl.java:40) 
    at com.google.appengine.api.system.SystemServiceImpl.startBackgroundRequest(SystemServiceImpl.java:28) 
    at com.google.firebase.database.utilities.DefaultRunLoop$FirebaseThreadFactory.newThread(DefaultRunLoop.java:13) 
    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 com.google.firebase.database.connection.PersistentConnectionImpl.doIdleCheck(PersistentConnectionImpl.java:1098) 
    at com.google.firebase.database.connection.PersistentConnectionImpl.<init>(PersistentConnectionImpl.java:266) 
    at com.google.firebase.database.core.GaePlatform.newPersistentConnection(GaePlatform.java:128) 
    at com.google.firebase.database.core.Context.newPersistentConnection(Context.java:195) 
    at com.google.firebase.database.core.Repo.<init>(Repo.java:64) 
    at com.google.firebase.database.core.RepoManager.createLocalRepo(RepoManager.java:87) 
    at com.google.firebase.database.core.RepoManager.createRepo(RepoManager.java:28) 
    at com.google.firebase.database.FirebaseDatabase.ensureRepo(FirebaseDatabase.java:249) 
    at com.google.firebase.database.FirebaseDatabase.getReference(FirebaseDatabase.java:114) 
    at com.safran.contactify.backend.RunMeNowEndpoint.insert(RunMeNowEndpoint.java:105) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:44) 
    at com.google.api.server.spi.SystemService.invokeServiceMethod(SystemService.java:363) 
    at com.google.api.server.spi.SystemServiceServlet.execute(SystemServiceServlet.java:113) 
    at com.google.api.server.spi.SystemServiceServlet.doPost(SystemServiceServlet.java:71) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at com.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:48) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:439) 
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:446) 
    at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:256) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:310) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:302) 
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:443) 
    at java.lang.Thread.run(Thread.java:745) 

risposta

15

Per utilizzare Firebase con App Engine, è necessario utilizzare scala manuale. Questo perché Firebase utilizza thread in background per ascoltare i cambiamenti e App Engine consente solo le discussioni longeve fondo sulle istanze di back-end in scala manualmente. Aggiungere seguente configurazione al appengine-web.xml

<manual-scaling> 
    <instances>1</instances> 
</manual-scaling> 
+0

Secondo la documentazione Questo significa che non ci sarà una sola istanza del servizio indipendentemente dalla quantità di richieste. Questo significa che le richieste saranno eseguiti in modo sincrono uno dopo l'altro, dal momento che c'è una sola istanza del nostro servizio? "Un servizio con scala manuale funziona continuamente lo stesso numero esatto di casi indipendentemente dal livello di carico. Ciò consente di compiti come inizializzazioni complessi e le applicazioni che si basano sullo stato della memoria nel tempo." –

+1

Sì, l'applicazione non sarà affatto scalabile. Avrai una certa quantità di richieste che un'istanza può gestire, tutte le altre richieste attenderanno in coda. – Yevgen

+0

Come mai questo non è menzionato nei documenti !! :( – Noman

Problemi correlati