2017-07-22 2 views
0

firebaseデータベースのキーをある値に設定する単純なアプリケーションを構築したいと思います。それは非同期なので、CountDownLatchを作成して完了するのを待ちますが、完了することはありません。Firebase Java SDKが設定後に終了できないのはなぜですか?

package me.ibrohim.adler; 

import com.google.firebase.FirebaseApp; 
import com.google.firebase.FirebaseOptions; 
import com.google.firebase.auth.FirebaseCredentials; 
import com.google.firebase.database.FirebaseDatabase; 
import com.google.firebase.tasks.OnCompleteListener; 
import com.google.firebase.tasks.Task; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.Set; 
import java.util.concurrent.CountDownLatch; 
import java.util.function.Consumer; 

public class Main { 

    public static void main(String [] args) throws InterruptedException { 

     FileInputStream serviceAccount = null; 

     try { 

      serviceAccount = new FileInputStream("/home/ibrohim/.adler/adminsdk.json"); 

      FirebaseOptions options = new FirebaseOptions.Builder() 
        .setCredential(FirebaseCredentials.fromCertificate(serviceAccount)) 
        .setDatabaseUrl("https://[my app].firebaseio.com/") 
        .build(); 

      FirebaseApp.initializeApp(options); 

     } catch (IOException e) { 

      e.printStackTrace(); 

     } finally { 

      if (serviceAccount != null) try { 

       serviceAccount.close(); 

      } catch (IOException e) { 

       e.printStackTrace(); 

      } 

     } 


     CountDownLatch done = new CountDownLatch(1); 

//  new Thread(() -> { 
//   try { 
//    Thread.sleep(1000); 
//    done.countDown(); 
//   } 
//   catch (Exception e){ 
//    System.err.println(e); 
//   } 
//  }).start(); 

     FirebaseDatabase 
       .getInstance() 
       .getReference("[some path]") 
       .setValue("[some value]") 
       .addOnCompleteListener(task -> done.countDown()); 

     done.await(); 

    } 

} 

答えて

0

は、私はちょうどのIntelliJでこのコードを実行しました::

は、ここに私のコードです

CountDownLatch done = new CountDownLatch(1); 
database.getReference("45253891").setValue("[some value]") 
     .addOnCompleteListener(task -> done.countDown()); 
done.await(); 

そして、それは何の問題もなく走りました。 (結果を参照してくださいhere

あなたのシステムで何が起こっているのか分かりません。 setValue()コールにアクセスしてもよろしいですか?

更新:コメントダグ・スティーブンソンでは、あなたが完了したら、JVMが終了することを確認する方法を示しています。

私は、彼らが「知ったとき、私は一般的に停止する事を強制するのawait後System.exit(0)を追加します再実行されます。

したがって、上記のようなCountDownLatchまたは同様の同期プリミティブを使用しますが、その後にSystem.exit(0)を追加します。

+0

はい、それはsetValueに達し、データベースのmy値が変更されました。プログラムは決して止まらない。ここに私のスタックトレースです:https://pastebin.com/SVy1GNsD – ibrohimislam

+0

そしてこれらのバージョンを使用してください:https://pastebin.com/cTGfY0rj – ibrohimislam

+0

私は何が起こっているのかは分かりません。 'done.await()'の後に 'System.out.println()'を置くと、それは実行されますか? –

関連する問題