Firebase транзакция никогда не вызывает onComplete ()

1

Работая с Firebase в Java, у меня есть ситуация, когда кажется, что Transaction.Handler.onComplete() никогда не вызывается.

Я пытаюсь дождаться завершения в конкретной транзакции, поэтому я продолжаю называть вызывающий поток до вызова onComplete(). Это делается анонимным декоратором вокруг существующего Transaction.Handler txn.

Transaction.Handler txn = ...
CountDownLatch latch = new CountDownLatch(1);

ref.runTransaction(new Transaction.Handler() {

  @Override
  public Transaction.Result doTransaction(MutableData data) {
    return txn.doTransaction(data);
  }

  @Override
  public void onComplete(FirebaseError e, boolean wasCommitted, DataSnapshot data) {
    System.out.println("never printed");
    txn.onComplete(e, wasCommitted, data);
    if(e != null || !wasCommitted) {
      System.out.println("error: " + e + ", committed: " + wasCommitted);
    }
    latch.countDown();
  }

});

latch.await(); 
System.out.println("never printed");

doTransaction() определенно завершается хотя бы один раз - и я вижу обновление данных в веб-интерфейсе, но onComplete() никогда не вызывается, и мы просто зависаем.

Я не могу ничего плохого с этим рисунком обертки см: Я побежал ту же самую операцию в одиночку в тесте main() метод на другой Firebase и onComplete() называется.

Что вызывает это зависание? Есть ли что-то в конфигурации Firebase (например, auth? Rules?), Которая вводит здесь ошибку?

РЕДАКТИРОВАТЬ

У меня такая же проблема без шаблона обертки. Вот этот код:

CountDownLatch latch = new CountDownLatch(1);
ref.runTransaction(new Transaction.Handler() {

  @Override
  public void onComplete(FirebaseError e, boolean b, DataSnapshot data) {
    if(e != null || !b) {
      System.out.println("error: " + e + ", committed: " + b);
    }
    System.out.println("transaction finished!");
    latch.countDown();
  }

  @Override
  public Result doTransaction(MutableData data) {
    System.out.println("doing transaction");
    data.child(...).setValue(...);
    return Transaction.success(data);
  }
});

latch.await();
System.out.println("never printed");

Это приводит к печати doing transaction и изменению данных в Firebase (что я вижу через веб-интерфейс), но не transaction finished печати transaction finished. Он просто висит.

  • 0
    Если в этом конкретном месте в Firebase есть много споров, возможно, транзакция не может быть завершена (поскольку транзакции Firebase выполняются на стороне клиента). Много ли споров за это место в Firebase? Кроме того, какую версию клиента вы используете?
  • 0
    @JennyTong Только этот процесс касается этого поддерева Firebase. (Если это помогает, doTransaction() запускается только один раз, а затем веб-интерфейс Firebase показывает обновления.) Я использую клиент JVM 2.1.2.
Показать ещё 4 комментария
Теги:
firebase
transactions

1 ответ

4

На Android все обратные вызовы Firebase запускаются в основном потоке. Если вы вызываете latch.await() в основном потоке, onComplete никогда не будет работать, потому что основной поток заблокирован, что приводит к взаимоблокировке.

  • 0
    Интересно. (Хотя, как я уже говорил выше, я использую клиент Firebase JVM.)
  • 0
    Можете ли вы предоставить более подробную информацию? На какой JVM вы работаете? Какой язык вы используете? Вы также добавили тег Android, поэтому я предположил, что вы работаете на Android.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню