Firebase Java SDK 不会持久化数据,也不会触发回调。任务似乎永远不会完成



我正在尝试根据本指南编写一些数据,https://firebase.google.com/docs/database/server/start 并使用Play Framework + Scala。

调用 DatabaseReference.setValue 后,没有任何反应:数据不会保留在 Firebase 上,我的回调也不会被触发。

代码如下:

lazy val conf = ConfigFactory.load()
lazy val options = new FirebaseOptions.Builder()
.setCredential(FirebaseCredentials.fromCertificate(new FileInputStream(conf.getString("firebase.credentials.path"))))
.setDatabaseUrl("https://orsz-xxxxx-xxxxx.firebaseio.com/")
.build()
lazy val propsDB = FirebaseDatabase.getInstance().getReference()
/** Initialize block to instantiates FirebaseApp **/
{
println("[FirebasePersistence] - Initialize FirebaseApp")
FirebaseApp.initializeApp(options)
FirebaseDatabase.getInstance().setLogLevel(Logger.Level.DEBUG)
println("[FirebasePersistence] - Initialize FirebaseApp Done!")
}
def persistProposition(prop: Proposition): Future[Proposition] = Future {
val task = propsDB.setValue(1, new DatabaseReference.CompletionListener() {
override def onComplete(databaseError: DatabaseError, databaseReference: DatabaseReference) {
if (databaseError != null) {
println("Error: " + databaseError.getMessage)
} else {
println("[FirebasePersistence.persistProposition] - OK")
}
}
})
prop
}

我可以看到,在 SBT 控制台上进行测试,即使在几秒钟后,在 setValue 上生成的任务也永远不会完成:

scala> task.isComplete
res6: Boolean = false

使用Firebase日志级别DEBUG执行我得到以下日志:

Thu Apr 06 08:53:37 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Trying to fetch auth token
Thu Apr 06 08:53:37 BRT 2017 [DEBUG] RepoOperation: set: /
Thu Apr 06 08:53:37 BRT 2017 [DEBUG] DataOperation: set: / 1
Thu Apr 06 08:53:37 BRT 2017 [DEBUG] RepoOperation: Aborting transactions for path: /. Affected: /
Thu Apr 06 08:53:38 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Successfully fetched token, opening connection
Thu Apr 06 08:53:38 BRT 2017 [DEBUG] Connection: conn_0 - Opening a connection
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - websocket opened
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - Reset keepAlive
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - ws message: {"t":"c","d":{"t":"h","d":{"ts":1491479619239,"v":"5","h":"s-usc1c-nss-135.firebaseio.com","s":"bxE2HQCxtNNs4EznaO5xjWsInnIpu5Fi"}}}
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - Reset keepAlive. Remaining: 44991
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - HandleNewFrameCount: 1
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - handleIncomingFrame complete frame: {t=c, d={t=h, d={h=s-usc1c-nss-135.firebaseio.com, s=bxE2HQCxtNNs4EznaO5xjWsInnIpu5Fi, v=5, ts=1491479619239}}}
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] Connection: conn_0 - Got control message: {t=h, d={h=s-usc1c-nss-135.firebaseio.com, s=bxE2HQCxtNNs4EznaO5xjWsInnIpu5Fi, v=5, ts=1491479619239}}
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] Connection: conn_0 - realtime connection established
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] PersistentConnection: pc_0 - onReady
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] PersistentConnection: pc_0 - handling timestamp
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Sending first connection stats
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] Connection: conn_0 - Sending data: {t=d, d={a=s, r=0, b={c={sdk.java.3-0-0=1}}}}
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - Reset keepAlive. Remaining: 44993
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] PersistentConnection: pc_0 - calling restore state
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Restoring auth.
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] Connection: conn_0 - Sending data (contents hidden)
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - Reset keepAlive. Remaining: 44996
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - ws message: {"t":"d","d":{"r":0,"b":{"s":"ok","d":""}}}
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - Reset keepAlive. Remaining: 44836
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - HandleNewFrameCount: 1
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - handleIncomingFrame complete frame: {t=d, d={r=0, b={d=, s=ok}}}
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] Connection: conn_0 - received data message: {r=0, b={d=, s=ok}}
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] WebSocket: ws_0 - ws message: {"t":"d","d":{"r":1,"b":{"s":"permission_denied","d":"Access denied."}}}
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] WebSocket: ws_0 - Reset keepAlive. Remaining: 43628
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] WebSocket: ws_0 - HandleNewFrameCount: 1
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] WebSocket: ws_0 - handleIncomingFrame complete frame: {t=d, d={r=1, b={d=Access denied., s=permission_denied}}}
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] Connection: conn_0 - received data message: {r=1, b={d=Access denied., s=permission_denied}}
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Authentication failed: permission_denied (Access denied.)
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] Connection: conn_0 - closing realtime connection
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] WebSocket: ws_0 - websocket is being closed
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Got on disconnect due to OTHER
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Scheduling connection attempt
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] ConnectionRetryHelper: Scheduling retry in 821ms
Thu Apr 06 08:53:41 BRT 2017 [DEBUG] WebSocket: ws_0 - closed
Thu Apr 06 08:53:41 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Trying to fetch auth token
Thu Apr 06 08:53:41 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Successfully fetched token, opening connection

我可以在日志上看到一些权限被拒绝,但无法弄清楚原因。

我已经在FileInputStream上测试了凭据,没问题。

Firebase 项目的权限:

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

我已经使用 firebase-admin-4.1.6 和 firebase-server-sdk-3.0.1 进行了测试,并得到了相同的结果

编辑: 我在调用setValue之前打印了FirebaseApp,FirebaseDatabase和DatabaseReference对象,并得到了上面的行。 如何确保管理员 sdk 正确初始化?

FirebaseApp=FirebaseApp{name=[DEFAULT], options=FirebaseOptions{databaseUrl=https://orsz-xxxxx-xxxxx.firebaseio.com/, credential=com.google.firebase.auth.FirebaseCredentials$CertCredential@558b77e8, databaseAuthVariableOverride={}}}
FirebaseApp.name=[DEFAULT]
FirebaseDatabase.getInstance()=com.google.firebase.database.FirebaseDatabase@124cb42b
DatabaseReference=https://orsz-xxxxx-xxxxx.firebaseio.com/12345

我刚刚用一个新项目和管理 SDK 版本 4.1.6 进行了测试。

使用此 Java 代码:

final FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("43256111");
ref.setValue(1, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError != null) {
System.err.println(databaseError);
} else {
System.out.println("Written");
}
}
});

43256111是数据库中用于测试的位置。

几秒钟后我得到这个:

在这种情况下,规则甚至无关紧要,因为 Admin SDK 以管理权限运行,它甚至为我绕过了这些规则:

"43256111": {
".write": false
}

所以我不确定你的情况发生了什么,但我无法重现它。是否确定已正确初始化管理员 SDK?

最新更新