SpringMVC异步处理的 5 种方式

作者:丁仪

来源:https://chengxuzhixin.com/blog/post/SpringMVC-yi-bu-chu-li-de-5-zhong-fang-shi.html

 

前段时间研究了下 diamond 的原理,其中有个重要的知识点是长连接的实现,用到了 servlet 的异步处理。异步处理最大的好处是可以提高并发量,不阻塞当前线程。其实 Spring MVC 也支持了异步处理,本文记录下相关的技术点。

 

异步处理 demo

如果要启用异步返回,需要开启 @EnableAsync。如下的代码中,使用 DeferredResult 进行异步处理。

请求进来后,首先创建 DeferredResult 对象,设置超时时间为 60 秒。然后指定 DeferredResult 在异步完成和等待超时时的回调。同步的处理只需要创建异步任何,然后返回 DeferredResult 即可。这样 Spring MVC 处理完此次请求后,不会立即返回 response 给客户端,会一直等待 DeferredResult 处理完成。如果 DeferredResult 没有在 60 秒内处理完成,就会触发超时,然后返回 response 给客户端。

@RequestMapping(value = "/async/demo")
public DeferredResult<String> async(){
    // 创建 DeferredResult,设置超时时间 60s
    DeferredResult<String> deferredResult = new DeferredResult<>((long)60 * 1000);

    String uuid = UUID.randomUUID().toString();
    Runnable callback = () -> manager.remove(deferredResult, uuid);
    // 设置完成和超时的回调
    deferredResult.onCompletion(callback);
    deferredResult.onTimeout(callback);

    // 创建异步任务
    manager.addAsyncTask(deferredResult, uuid);

    // 同步返回 DeferredResult
    return deferredResult;
}

对于异步任务来说,需要持有 DeferredResult 对象。在异步处理结束时,需要手动调用 DeferredResult.setResult 完

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值