Firebase - App Engine上的奇怪行为

时间:2016-06-12 02:14:53

标签: java google-app-engine firebase firebase-realtime-database

目前在Java App Engine上使用Firebase 3.0.2。我正在部署到基本的扩展模块。我的目标是将一些数据从数据存储区导出到firebase。我使用任务队列一次从数据存储区处理一个实体。我正在尝试将数据存储区中的Car对象添加到Firebase中。完成事务后(我希望保持相同的ID并能够更新此数据,因此事务)我想将数据添加到autosuggest / cars / path并更新计数器(也使用事务)。

所以我正在构建的结构是:

{
 "autosuggest": { 
    "cars" {
        "bu": {
             "123": {
                  "name": "buick"
              }
       }
},
"cars": {
    "123": {
         "name" : "buick",
         "desc": "Big car"
      }
},
"stats": {
     "carCt": 1
   }
}

然而,我得到了奇怪的结果,例如交易没有完成。我也在/ autosuggest / cars /中获取数据,以carIds为关键。 CarIds仅用于代码中的/ key中的键       FirebaseDatabase.getInstance()。getReference()。child(" cars")。child(String.valueOf(cars.getId()))。runTransaction(new Handler(){             @覆盖             public Result doTransaction(MutableData mutableData){                 mutableData.setValue(部门);                 return Transaction.success(mutableData);             }

        @Override
        public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
            if (databaseError != null) {

            } else {
                addToAutoSuggestForString(car, String.valueOf(car.getId()));
                incrementCarCounter();
            }
        }
    });

 private void incrementCarCounter() {
     FirebaseDatabase.getInstance().getReference().child("stats").child("carCt").runTransaction(new Handler() {
        @Override
        public Result doTransaction(MutableData mutableData) {
            Integer currentData = mutableData.getValue(Integer.class);
            if (currentData == null) {
                mutableData.setValue(1);
            } else {
                mutableData.setValue(currentData + 1);
            }
            return com.google.firebase.database.Transaction.success(mutableData);
        }

        @Override
        public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
            if (databaseError != null) {
                log.info("error");
            } else {
                log.info("Firebase counter increment succeeded.");
            }
        }
    });
}
 private void addAutoSuggestForString(final AutoCompleteResult result, String name) {
  FirebaseDatabase.getInstance().getReference().child("autosuggest/cars").child(searchStr + "/" + result.getKey()).setValue(result);
    }
}

上面的代码中是否有任何会导致奇怪行为和/或交易失败的内容?运行这是一个最大速率为10 / s的任务问题吗? Firebase sdk的内部有点神秘。是否一遍又一遍地调用Firebase.getInstance()。getReference(),或者每次打开一个单独的websocket?

0 个答案:

没有答案