0

Ich versuche, Firebase Realtime DB über Admin SDK von einem Endpunkt in Java zuzugreifen. Die Authentifizierung scheint erfolgreich zu sein, die Abfrage hat jedoch keine Auswirkungen. Es tritt kein Fehler auf und die Listener werden nicht aufgerufen. Die Firebase-Regel ist beschreibbar (mit Simulator gesichert).Firebase Admin von einem Endpunkt in Java

Firebase db:

mydbid 
     +---users 
      +---user0 
       +---email:[email protected] 

Endpoint def:

@Api(
    name = "firebaseTestEndpoint", 
    version = "v1", 
    description = "Firebase admin test endpoint.") 

public class FirebaseTestService { 
    private static final Logger log = 
    Logger.getLogger(FirebaseTestService.class.getName()); 
    static { 
     log.setLevel(Level.INFO); 
    } 

@ApiMethod(httpMethod = HttpMethod.POST) 
public void connectToFirebase(@Named("id") String id, 
           ServletContext servletContext) { 

    Map<String, Object> authVars = new HashMap<String, Object>(); 
    authVars.put("uid", "admin"); 

    try { 
     FirebaseOptions options = new FirebaseOptions.Builder() 
       .setDatabaseUrl("https://mydbid.firebaseio.com")    
       .setCredential(FirebaseCredentials.fromCertificate(
        servletContext.getResourceAsStream(
         "/WEB-INF/firebase-credentials.json"))) 
       .setDatabaseAuthVariableOverride(authVars) 
       .build(); 
     FirebaseApp app = FirebaseApp.initializeApp(options); 
     DatabaseReference ref = 
    FirebaseDatabase.getInstance().getReference("https://stackoverflow.com/users/user0/email"); 
     ValueEventListener valueEventListener = 
    ref.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot arg0) { 
       log.info(arg0.getRef().getPath().toString() + 
         " changed to " + arg0.getValue(String.class)); 
      } 

      @Override 
      public void onCancelled(DatabaseError arg0) { 
       log.info("cancelled"); 
      } 
     }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@ApiMethod(httpMethod = HttpMethod.POST) 
public void updateEmail(@Named("id") String id) { 

    Map<String,Object> values = new HashMap<String,Object>(); 
    values.put("email", "[email protected]"); 
    try { 
     FirebaseDatabase.getInstance().getReference("https://stackoverflow.com/users/user0") 
     .updateChildren(values, new DatabaseReference.CompletionListener() { 
      public void onComplete(DatabaseError databaseError, 
            DatabaseReference databaseReference) { 
       if (databaseError != null) { 
        throw databaseError.toException(); 
       } 
       log.info("update completed."); 
      } 
     }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

appengine-web.xml (bezogen Teile):

<basic-scaling> 
    <max-instances>2</max-instances> 
</basic-scaling> 

web.xml (bezogen Teile; ein Raum eingefügt vor *):

<servlet> 
    <servlet-name>EndpointsServlet</servlet-name> 
    <servlet-class>com.google.api.server.spi.EndpointsServlet</servlet-class> 
    <init-param> 
    <param-name>services</param-name> 
    <param-value>mypackage.FirebaseTestService</param-value> 
    </init-param> 
</servlet> 
<servlet-mapping> 
    <servlet-name>EndpointsServlet</servlet-name> 
    <url-pattern>/_ah/api/ *</url-pattern> 
</servlet-mapping> 

<servlet> 
    <servlet-name>SystemServiceServlet</servlet-name> 
    <servlet-class>com.google.api.server.spi.SystemServiceServlet</servlet-class> 
    <init-param> 
    <param-name>services</param-name> 
    <param-value>mypackage.FirebaseTestService</param-value> 
    </init-param> 
</servlet> 
<servlet-mapping> 
    <servlet-name>SystemServiceServlet</servlet-name> 
    <url-pattern>/_ah/spi/ *</url-pattern> 
</servlet-mapping> 

Getestet im APIs Explorer, auf den Aufruf connectToFirebase() folgt eine Anforderung an _ah/background, aber updateEmail() nicht. Was ist los?

+0

Datenbank-Listener werden auf separaten Hintergrundthreads ausgeführt. Ihre Anfragethreads werden zurückgegeben, bevor die Listener ausgeführt werden. Können Sie versuchen, auf sie zu warten, und sehen, ob das einen Unterschied macht? Sie können die Aufgaben-API zum Warten verwenden: https://firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/tasks/Tasks –

+0

Mit Tasks.await (Task) ist DEADLINE_EXCEEDED Fehler ist zurückgekommen. Es scheint, dass Hintergrund Thread seinen Job nicht abschließen kann ... –

+0

Können Sie Ihre Firebase SDK-Version bestätigen? Außerdem können Sie mit der ThreadManager-API sicherstellen, dass Ihre Instanz tatsächlich Hintergrund-Thread-Unterstützung bietet. Sie können einen Hintergrund-Thread selbst erstellen und starten, um dies zu überprüfen: https://cloud.google.com/appengine/docs/standard/java/runtime#background_threads_1 –

Antwort

0

Um Firebase-Listener in AppEngine verwenden zu können, ändern Sie die grundlegende Skalierung in manuelle Skalierung.

Wenn Sie Basic oder Autoscaling von AppEngine-Instanzen verwenden möchten, ändern Sie die Firebase-Listener in REST-Aufrufe.

+0

Danke, aber keine Wirkung. –

Verwandte Themen