当前位置: 首页 > 面试题库 >

Java Firebase:延迟退出,直到写入完成

穆鸿波
2023-03-14
问题内容

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

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

在Firebase客户端中,何时onComplete()永远不会调用回调?是否有合理的僵局危险?


问题答案:

取自此google小组讨论。它使用一个布尔值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());
    }
}


 类似资料:
  • 我使用的是Spring Cloud Stream Kafka,但我有一个特殊的服务,它有一个复杂的启动依赖(长时间运行),可能非常脆弱,所以我希望延迟Kafka(消费者)绑定,直到确认成功初始化。 我怎样才能做到这一点?

  • 我有一个Spring启动应用程序在负载均衡器后面的两台服务器上运行。 我定义了一个关闭钩子,它将应用程序中的/healthcheckendpoint设置为返回404错误,等待30秒以完成所有操作,然后停止JVM。负载平衡器被配置为在看到404错误时将服务器置于维护模式。(这与“停机”状态不同——允许在维护模式下完成飞行中的连接) 问题是负载平衡器从未看到这些404响应。相反,它会拒绝第4层TCP连

  • 我有一个Spring Boot应用程序在负载均衡器后面的两个服务器上运行。 我定义了一个shutdown挂钩,它将应用程序中的/healthcheckendpoint设置为返回404错误,等待30秒以完成所有操作,然后停止JVM。负载均衡器被配置为在看到404错误时将服务器置于维护模式。(这与“down”状态不同--飞行中的连接允许在维护模式下完成)

  • 问题内容: 有人对如何实现自己的XAResource有很好的教程或建议吗?我需要Spring的MailSender进行事务处理,以便仅在事务提交后才发送邮件,而且似乎没有任何现有的事务包装器。 问题答案: 如您在评论中所述,如果您只需要等待提交,则可以调查用于触发提交时发送电子邮件的情况。

  • 问题内容: 我下面有一段代码,该代码创建了几个线程来执行任务,而单独运行效果很好。但是,我很难理解为什么在所有线程完成并调用该语句之前,我在函数中调用的打印语句不会执行。我希望它们在线程执行时被调用。有没有简单的方法可以做到这一点,为什么首先要这样做呢? 问题答案: 这是由于stdout缓冲引起的。您仍然可以刷新缓冲区: 您可以在此处和此处找到有关此问题的更多信息。

  • 问题内容: 我有一个搜索字段。现在,它会搜索每个键。因此,如果有人键入“ Windows”,它将使用AJAX搜索每个键入的内容:“ W”,“ Wi”,“ Win”,“Wind”,“ Windo”,“ Window”,“ Windows”。 我希望有一个延迟,因此它仅在用户停止键入200毫秒时才搜索。 函数中没有为此的选项,我已经尝试过了,但是没有用。 我怎样才能做到这一点? 问题答案: 我将这个小