【问题标题】:java Firebase: delay exit until writes finishjava Firebase:延迟退出直到写入完成
【发布时间】:2014-09-29 04:35:09
【问题描述】:

我有一个用 Java 编写的服务器,它可以在侦听、处理和更新 Firebase 数据时接收关闭信号。由于 Firebase 线程是 Java 中的守护线程,因此我想向主线程添加一些延迟以允许完成写操作。

我目前的想法是闩锁方法:使用一些并发计数器来跟踪挂起的写入操作,并在没有时让主线程退出。计数器会在onComplete() 回调中更新,所以我想知道:

在 Firebase 客户端中,onComplete() 回调何时可能永远不会被调用?是否存在合理的死锁危险?

【问题讨论】:

    标签: java multithreading concurrency firebase


    【解决方案1】:

    取自this google group discussion。这使用了一个布尔值 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());
        }
    }
    

    【讨论】:

    • 这是我将使用的方法。如果onComplete() 回调永远不会发生,是否有任何理由也有一个计时器?我正在考虑类似CountDownLatch.await(long timeout, TimeUnit unit).
    • onComplete 应始终触发错误条件或结果。唯一的例外是如果服务器离线并且再也没有上线,在这种情况下脚本可能是您最不担心的:)
    • 如果 firebase 验证失败,线程将永远不会停止。我通过删除管理控制台中的密钥进行了测试。
    【解决方案2】:

    我认为你应该分三个阶段关闭服务器:

    1. 停止接收更多工作
    2. 等待所有工作完成
    3. 当工作计数器为 0 时,关闭守护程序线程池。

    在您的写作任务中使用finally 应确保始终调用onComplete()

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

    【讨论】:

    • 谢谢!通过“闩锁方法”,我的意思是按照您的建议进行操作。我的问题实际上是关于 Firebase 内部的。写入由 Firebase 异步执行,因此我无法将它们包装在 try 块中,并且我不确定会引发哪些异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多