我在Spring Boot应用程序中使用Firebase JAVA sdk。
尝试验证firebase令牌:
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=......}
可能的原因是什么?
答案 0 :(得分:4)
我认为你误解了日志。 Tasks.await()
正在履行职责。请记住,成功监听器没有义务在Tasks.await()
之前或之后准确执行。它将在任务完成后执行一段时间,就像Tasks.await()在任务完成后返回一段时间一样。另请注意,日志行来自两个不同的线程:http-nio-8080-exec-1
和pool-2-thread-2
,并且无法保证在任务完成时这两个线程将继续的顺序。
现在,如果要确保运行Tasks.await()的线程仅在成功侦听器之后执行,则必须使用类似CountDownLatch的东西来阻止第一个线程,直到成功侦听器中的工作完成为止