Java 在Firebase Admin SDK上创建REST API控制器
我试图在Firebase admin sdk上构建REST API控制器(使用spring启动框架),但我面临以下问题: 假设,如果我收到一个GET请求,它需要从Firebase实时数据库读取数据,并作为该GET请求的响应返回。只能使用异步侦听器从Firebase实时数据库读取数据,因此如何实现这一点: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
- 我是否需要等待异步调用完成,以给出对该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的往返调用,并大大提高了吞吐量。这里有一个例子