编程语言
首页 > 编程语言> > Java 8 Firebase Tasks.await()

Java 8 Firebase Tasks.await()

作者:互联网

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

尝试验证Firebase令牌:

地图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)假设在任务完成之前阻止代码执行.但是,它不会阻止代码和logger.info(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-1和pool-2-thread-2,并且无法保证任务完成后这两个线程将继续执行的顺序.

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

标签:firebase-admin,java,firebase
来源: https://codeday.me/bug/20191012/1898577.html