Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Firebase Admin SDK上创建REST API控制器_Java_Firebase_Spring Boot_Asynchronous_Firebase Admin - Fatal编程技术网

Java 在Firebase Admin SDK上创建REST API控制器

Java 在Firebase Admin SDK上创建REST API控制器,java,firebase,spring-boot,asynchronous,firebase-admin,Java,Firebase,Spring Boot,Asynchronous,Firebase Admin,我试图在Firebase admin sdk上构建REST API控制器(使用spring启动框架),但我面临以下问题: 假设,如果我收到一个GET请求,它需要从Firebase实时数据库读取数据,并作为该GET请求的响应返回。只能使用异步侦听器从Firebase实时数据库读取数据,因此如何实现这一点: 我是否需要等待异步调用完成,以给出对该GET请求的响应?(如果是,任何示例) 或者在这里遵循其他最佳实践 类似于这一点的东西应该会起作用: final CountDownLatch l

我试图在Firebase admin sdk上构建REST API控制器(使用spring启动框架),但我面临以下问题:

假设,如果我收到一个GET请求,它需要从Firebase实时数据库读取数据,并作为该GET请求的响应返回。只能使用异步侦听器从Firebase实时数据库读取数据,因此如何实现这一点:

  • 我是否需要等待异步调用完成,以给出对该GET请求的响应?(如果是,任何示例)
  • 或者在这里遵循其他最佳实践

类似于这一点的东西应该会起作用:

    final CountDownLatch latch = new CountDownLatch(1);
    final AtomicReference<Object> value = new AtomicReference<>(null);
    final AtomicReference<Exception> exception = new AtomicReference<>(null);

    ref.getReference().addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot snapshot) {
        value.set(snapshot.getValue());
        latch.countDown();
      }

      @Override
      public void onCancelled(DatabaseError error) {
        exception.set(error.toException());
        latch.countDown();
      }
    });

    latch.await(30, TimeUnit.SECONDS);
    if (exception.get() != null) {
      // handle error
    }

    Object result = value.get();
    // return result to user
最终倒计时闩锁=新倒计时闩锁(1);
最终AtomicReference值=新的AtomicReference(null);
最终AtomicReference异常=新的AtomicReference(null);
ref.getReference().addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
公共无效onDataChange(数据快照快照){
value.set(snapshot.getValue());
倒计时();
}
@凌驾
已取消的公共无效(DatabaseError错误){
exception.set(error.toException());
倒计时();
}
});
等待(30,时间单位秒);
if(exception.get()!=null){
//处理错误
}
对象结果=value.get();
//将结果返回给用户

我建议将所有同步逻辑(带闩锁和原子引用)移动到一个新的可重用类中,这样代码就变得简单且可读性更强。

我认为这会阻止代码,直到从Firebase读取完成为止,这是最好的做法吗?如果您希望在收到请求时从数据库中读取数据,并在HTTP响应中发送回数据,这是实现它的唯一方法。如果您提前知道要读取的引用,您可以在其上注册一个侦听器,该侦听器会更新一些内存中的数据结构,并且您的HTTP控制器可以从该数据结构中读取。@Rajesh如果您使用Servlet 3.0并从控制器返回一个
completablefuture
,当Firebase admin sdk从自己的线程运行时,http处理线程将被释放以继续处理新请求。这避免了您有限数量的Servlet线程阻塞对Firebase的往返调用,并大大提高了吞吐量。这里有一个例子