2014-09-29 3 views
2

У меня есть сервер, написанный на Java, который может получать сигнал отключения, когда он прослушивает, обрабатывает и обновляет данные Firebase. Поскольку потоки Firebase являются потоками демона в Java, я хотел добавить некоторую задержку в основной поток, чтобы разрешить выполнение операций записи.java Firebase: delay exit до записи заканчивается

Моя нынешняя идея - подход с защелкой: используйте некоторый параллельный счетчик для отслеживания ожидающих операций записи и дайте основному потоку выйти, если его нет. Счетчик будет обновлен в обратных вызовах, поэтому мне было интересно:

В клиенте Firebase, когда onComplete() callbacks никогда не вызываются? Существует ли разумная опасность тупика?

ответ

5

взято с this google group discussion. В этом случае используется boolean done (AtomicBoolean для операций с потоками в этом случае) и цикл while.

import com.firebase.client.Firebase; 
import com.firebase.client.FirebaseError; 

import java.util.Date; 
import java.util.concurrent.atomic.AtomicBoolean; 

public class Demo { 

    public static void main(String[] args) { 
     final AtomicBoolean done = new AtomicBoolean(false); 
     Firebase ref = new Firebase("https://testjava.firebaseio-demo.com/"); 
     ref.setValue(new Date().toString(), new Firebase.CompletionListener() { 
      @Override 
      public void onComplete(FirebaseError firebaseError, Firebase firebase) { 
       done.set(true); 
      } 
     }); 
     while (!done.get()); 
    } 
} 
+0

Это тот подход, который я буду использовать. Есть ли причина иметь таймер, а в случае, если обратный вызов 'onComplete()' никогда не происходит? Я думаю о чем-то вроде [CountDownLatch.await (long timeout, TimeUnit unit)] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html#await% 28long,% 20java.util.concurrent.TimeUnit% 29). –

+0

onComplete должен всегда запускать либо с условием ошибки, либо с результатом. Единственное исключение из этого было бы, если бы сервер был в автономном режиме и никогда не появлялся в сети снова, и в этом случае сценарий может быть наименьшим из ваших забот :) – Kato

+0

если firebase не удалось аутентифицировать, поток никогда не остановится. Я протестировал, удалив ключ в консоли администратора. –

1

Я думаю, вы должны выключить сервер в 3 этапа:

  1. остановка приема больше работы
  2. ждать за всю работу, чтобы закончить
  3. вопрос к останову для демона пула потоков, когда рабочий счетчик 0.

Используя в своих письменных заданий в finally должен обеспечить onComplete() всегда называется.

try { 
    //write 
} 
finally { 
    callbackObject.onComplete(); 
} 
+0

Спасибо! Под «защелкой» я хотел сделать то, что вы рекомендуете. Мой вопрос действительно о внутренних компонентах Firebase. Запись выполняется асинхронно Firebase, поэтому я не могу обернуть их в блок try, и я не уверен, какие исключения будут выбрасываться. –

Смежные вопросы