Java 8 Firebase 任务.await()

标签 java firebase firebase-admin

我在我的 Spring Boot 应用程序中使用 Firebase JAVA sdk。

尝试验证 Firebase token :

Map resp = new HashMap();

Task<FirebaseToken> task = FirebaseAuth.getInstance().verifyIdToken(info.getToken())
        .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
            @Override
            public void onSuccess(FirebaseToken decodedToken) {
                logger.info(decodedToken.getClaims());

                String uid = decodedToken.getUid();
                User user = userDao.loadUserByUID(uid);

                if (user == null) {
                     ...........
                }
                SimpleSignInAdapter.signin(user.getUsername());

                resp.put("status", "success");
                resp.put("token", jwtTokenProvider.createToken(SecurityContextHolder.getContext().getAuthentication()));
                logger.info(resp);
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(Exception e) {
                resp.put("status", "fail");
                resp.put("message", e.getMessage());
            }
        });
try {
    Tasks.await(task);
    logger.info(resp);
    return resp;
} catch (ExecutionException | InterruptedException e) {
    resp.put("status", "fail");
    resp.put("message", e.getMessage());
    return resp;
}

Tasks.await(task) 假设在 task 完成之前阻止代码执行。但是它不会阻止代码和 logger.info(resp); return resp; 在完成之前执行:

2017-09-20 16:10:30,613 INFO  [http-nio-8080-exec-1] impl.FirebaseServiceImpl (FirebaseServiceImpl.java:98) - {}
2017-09-20 16:10:30,613 INFO  [pool-2-thread-2] impl.FirebaseServiceImpl$2 (FirebaseServiceImpl.java:56) - {"aud":******" ******}}
2017-09-20 16:10:43,966 INFO  [pool-2-thread-2] impl.FirebaseServiceImpl$2 (FirebaseServiceImpl.java:84) -{status=success, token=......}

可能的原因是什么?

最佳答案

我认为您误解了日志。 Tasks.await() 正在执行它的工作。请记住,成功监听器没有义务准确地在 Tasks.await() 之前或之后执行。它会在任务完成后的某个时间执行,就像 Tasks.await() 在任务完成后的某个时间返回一样。另请注意,日志行来自两个不同的线程:http-nio-8080-exec-1pool-2-thread-2,并且无法保证任务完成后这两个线程将继续执行的顺序。

现在,如果你想确保运行 Tasks.await() 的线程只在成功监听器之后执行,你必须使用类似 CountDownLatch 的东西来阻塞第一个线程,直到成功监听器中的工作完成.

关于Java 8 Firebase 任务.await(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46318119/

相关文章:

java - 单元测试的意义何在?

Firebase auth CDN 不导出模块

Firebase 云函数 "admin.messaging(...).send is not a function"

javascript - 如何告诉 firebase-admin 停止(运行测试时)?

javascript - 通过 GitHub 进行 Firebase 身份验证 : setting the uid

java - 如何使用 BufferedInputStream 检测 Socket 输入流的结束?

java - 竞赛条件:整数的最小和最大范围

java - CMD (Java) 中的 Postgres Restore 不再响应,而相同的命令在 CMD 中执行良好

android - FirebaseRecyclerAdapter、PopulateViewHolder 滚动时多次调用

firebase - 以编程方式检查 Firebase 电话身份验证限制?