2017-09-12 34 views
1

Durch Ausführen des Beispielcodes von https://github.com/firebase/firebase-admin-java/blob/master/src/test/java/com/google/firebase/database/integration/ShutdownExample.javaWie Themen von Firebase Java Admin SDK

public class ShutdownExample { 

    public static void main(String[] args) { 
    final Semaphore shutdownLatch = new Semaphore(0); 

FirebaseApp app = 
    FirebaseApp.initializeApp(
     new FirebaseOptions.Builder() 
      .setDatabaseUrl("https://admin-java-sdk.firebaseio.com") 
      .build()); 

FirebaseDatabase db = FirebaseDatabase.getInstance(app); 
db.setLogLevel(Level.DEBUG); 
DatabaseReference ref = db.getReference(); 

ValueEventListener listener = 
    ref.child("shutdown") 
     .addValueEventListener(
      new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot snapshot) { 
       Boolean shouldShutdown = snapshot.getValue(Boolean.class); 
       if (shouldShutdown != null && shouldShutdown) { 
        System.out.println("Should shut down"); 
        shutdownLatch.release(1); 
       } else { 
        System.out.println("Not shutting down: " + shouldShutdown); 
       } 
       } 

       @Override 
       public void onCancelled(DatabaseError error) { 
       System.err.println("Shouldn't happen"); 
       } 
      }); 

try { 
    // Keeps us running until we receive the notification to shut down 
    shutdownLatch.acquire(1); 
    ref.child("shutdown").removeEventListener(listener); 
    db.goOffline(); 
    System.out.println("Done, should exit"); 
} catch (InterruptedException e) { 
    throw new RuntimeException(e); 
} 

Nach dem Aufruf von db.goOffline(), gibt es noch einige Threads stoppen laufen:

Referenz Handler Finalizer Signal Dispatcher FirebaseDatabaseWorker pool-5-thread-1

H Wie ist es möglich, es zu reinigen?

Antwort

1

Wenn Sie offline gehen, bedeutet dies, dass das Firebase Realtime Database SDK keine Vernetzung mehr durchführt. Es bedeutet nicht, dass sein Thread weggehen muss oder dass das Programm beendet werden sollte. Wenn Sie mit Ihrer Arbeit fertig sind und den Prozess beenden möchten, rufen Sie System.exit(0).

+0

Der Aufruf von System.exit (0) erledigt den Job. Wenn der Thread jedoch auf einem Tomcat-Webserver ausgeführt wird, fährt System.exit (0) den gesamten Tomcat-Webserver herunter, und auch andere Webanwendungen werden heruntergefahren. –

+0

Was ich empfehle ist für die einfache Ausführung von einigen Firebase-Datenbank-Code. Für Dienste, die auf unbestimmte Zeit bleiben, tun Sie das nicht. Lassen Sie den (Tomcat) Container einfach bestimmen, wann er beendet werden soll. Der Firebase-Thread verhindert das nicht. –

Verwandte Themen