java spring 异步_Java Spring – 从异步回调返回?

该博客讨论了在Spring框架中如何处理Firebase令牌来异步删除用户的问题。通过使用FirebaseUtil.getUid方法获取Firebase Token中的用户ID,但该操作是异步的,导致无法直接在deleteUser方法中获取结果。博主提出了使用DeferredResult来实现异步响应,允许在回调中设置结果,从而解决了这个问题。
摘要由CSDN通过智能技术生成

使用Spring(Java)和Firebase处理后端.我们使用Firebase令牌(附加为身份验证标头)来识别用户,使用built in UID.

不幸的是,从令牌中提取此UID必须异步完成,因此我只能从onSuccess回调中获取令牌.

为了提供响应,我必须从下面的deleteUser方法返回一个对象,但是在得到成功/失败回调之前我无法知道响应是什么!

我可以想象一种方法,通过等待一个标志来设置我的回调,或者有一些凌乱的时间,但是我想知道是否有一种干净的方式来处理这个而不引入竞争条件或许多额外的代码.有人可以帮忙吗?

请求映射(处理请求,提供响应)

@RequestMapping(value = "/users", method = RequestMethod.DELETE)

public @ResponseBody String deleteUser(@RequestHeader("Authentication") String token) {

FirebaseUtil.getUid(token, new OnSuccessListener() {

@Override

public void onSuccess(FirebaseToken decodedToken) {

String uid = decodedToken.getUid();

//RETURN SUCCESSFUL HERE

}

}, new OnFailureListener() {

@Override

public void onFailure(@NonNull Exception e) {

//RETURN FAILURE HERE

}

});

//MUST RETURN SOMETHING HERE?

User userToDelete = userDao.get(uid); //DONT HAVE THE uid HERE

userDao.delete(uid);

clearUserAccounts(userToDelete);

return uid + " was deleted";

}

FirebaseUtil.getUid()

public static void getUid(String token, OnSuccessListener successListener, OnFailureListener failureListener) {

FirebaseAuth.getInstance()

.verifyIdToken(token)

.addOnSuccessListener(successListener)

.addOnFailureListener(failureListener);

}

解决方法:

虽然在异步请求完成之前有一些方法可以阻塞线程,但是从Spring 3.2开始,有一个简单且资源有效的解决方案.

您可以使用DeferredResult< T>作为返回类型以启用异步处理.这允许servlet容器立即重用HTTP工作线程,同时避免强行序列化一系列异步请求.

通过填写注释,您的代码将如下所示:

@RequestMapping(value = "/users", method = RequestMethod.DELETE)

public DeferredResult deleteUser(@RequestHeader("Authentication") String token) {

final DeferredResult result = new DeferredResult<>();

FirebaseUtil.getUid(token, new OnSuccessListener() {

@Override

public void onSuccess(FirebaseToken decodedToken) {

String uid = decodedToken.getUid();

User userToDelete = userDao.get(uid);

userDao.delete(uid);

clearUserAccounts(userToDelete);

result.setResult(uid + " was deleted");

}

}, new OnFailureListener() {

@Override

public void onFailure(@NonNull Exception e) {

result.setErrorResult(e);

}

});

return result;

}

标签:java,asynchronous,spring,firebase,firebase-authentication

来源: https://codeday.me/bug/20190527/1165318.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
支付宝转账是一种常见的电子支付方式,它提供了异步回调机制来确保转账过程的可靠性和准确性。当进行转账操作时,支付宝系统会在转账成功或失败后,向商户后台发送一个异步回调通知。 Java开发人员可以通过编写代码来处理支付宝转账的异步回调。首先,需要在商户后台服务器上设置一个接收通知的URL,并确保服务器能够正常接收外部请求。然后,在Java代码中,可以使用一些框架或类库来处理HTTP请求,例如Spring MVC或Servlet。 接收到支付宝的异步回调通知后,需要对通知进行验证,以确保其合法性。在验证过程中,可以校验通知的来源、签名和传递的参数,以确定该通知确实来自于支付宝系统,并且没有被篡改。 验证通过后,就可以根据通知的参数进行相应的业务逻辑处理。通常,通知会包含转账的相关信息,如转账的金额、转账的双方账户等。在处理业务逻辑时,可以更新数据库或执行其他操作,以完成商户系统的业务流程。 在处理完业务逻辑后,需要向支付宝系统返回一个响应,通知支付宝系统商户已经接收到了该异步回调通知。一般来说,可以返回一个固定的字符串,表示接收成功,也可以返回其他需要的信息。 总的来说,Java开发人员可以通过编写代码来实现支付宝转账异步回调的功能。首先,需要设置接收通知的URL,并确保服务器能够正常接收外部请求。然后,在Java代码中,需要处理HTTP请求、验证通知的合法性、处理业务逻辑,并向支付宝系统返回响应。这样,就能够实现支付宝转账异步回调的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值