首页 > 解决方案 > Firebase admin sdk setValue 和 setValueAsync 从未完成

问题描述

我正在尝试使用 firebase admin sdk 写入我的实时数据库。我在用。但由于某种原因,请求没有执行。我正在使用斯卡拉。但我也觉得它与 java 相关,因为我刚刚将 java 代码转换为 scala。

<dependency>
  <groupId>com.google.firebase</groupId>
  <artifactId>firebase-admin</artifactId>
  <version>7.3.0</version>
</dependency>

我已经正确设置GOOGLE_APPLICATION_CREDENTIALS并且 auth 部分可以正常工作。我也将数据库的规则设置为,

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

代码 :

 def updateFireBase(updated: WxResponseString, symbol: String): Future[Unit] ={
    println("start")

    try{
      val options = FirebaseOptions.builder.setCredentials(GoogleCredentials.getApplicationDefault)
        .setDatabaseUrl("https://xxxxxxxxxx.firebaseio.com/").build
      val app: FirebaseApp =FirebaseApp.initializeApp(options)
      println(app.getOptions.getDatabaseUrl)
      val ref = FirebaseDatabase.getInstance.getReference
      val symbolRef = ref.child("ticker/" + symbol.toLowerCase())
      println(symbolRef.toString)

      return Future{
        println("this is start")
        symbolRef.setValueAsync(updated.last).get() // gets stuck here forever
        println("this is end !!!!!!!!!!!!!")

      }
    } catch {
      case e:Exception => {
        logger.error("err", e)
      }
    }
    Future.successful()



  }

println("this is start")被执行但println("this is end !!!!!!!!!!!!!")不是。我检查了 db url 是否正确,并通过调用 get 来确保线程被阻塞。我经历了JavaEE 和 Firebase admin sdk - setValueAsync not push data to realtime firebase和其他问题,但没有帮助。我也尝试了相同的代码,setValue并且它的回调永远不会被调用。

标签: javafirebasescalaplayframeworkfirebase-admin

解决方案


你可以这样尝试吗:

 def updateFireBase(updated: WxResponseString, symbol: String): Future[Unit] ={
    println("start")

    try{
      val options = FirebaseOptions.builder.setCredentials(GoogleCredentials.getApplicationDefault)
        .setDatabaseUrl("https://xxxxxxxxxx.firebaseio.com/").build
      val app: FirebaseApp =FirebaseApp.initializeApp(options)
      println(app.getOptions.getDatabaseUrl)
      val ref = FirebaseDatabase.getInstance.getReference
      val symbolRef = ref.child("ticker/" + symbol.toLowerCase())
      println(symbolRef.toString)

       ApiFuture<Void> future = symbolRef.setValueAsync(updated.last);
       future.get();

    } catch {
      case e:Exception => {
        logger.error("err", e)
      }
    }
    Future.successful()
  }

推荐阅读