异步请求:DeferredResult和Callable

ゝ一世哀愁。 2022-04-24 03:52 303阅读 0赞

示例代码如下

  1. package com.atguigu.controller;
  2. import java.util.UUID;
  3. import java.util.concurrent.Callable;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.ResponseBody;
  7. import org.springframework.web.context.request.async.DeferredResult;
  8. import com.atguigu.service.DeferredResultQueue;
  9. @Controller
  10. public class AsyncController {
  11. @ResponseBody
  12. @RequestMapping("/createOrder")
  13. public DeferredResult<Object> createOrder(){
  14. DeferredResult<Object> deferredResult = new DeferredResult<>((long)3000, "create fail...");
  15. DeferredResultQueue.save(deferredResult);
  16. return deferredResult;
  17. }
  18. @ResponseBody
  19. @RequestMapping("/create")
  20. public String create(){
  21. //创建订单
  22. String order = UUID.randomUUID().toString();
  23. DeferredResult<Object> deferredResult = DeferredResultQueue.get();
  24. deferredResult.setResult(order);
  25. return "success===>"+order;
  26. }
  27. /**
  28. * 1、控制器返回Callable
  29. * 2、Spring异步处理,将Callable 提交到 TaskExecutor 使用一个隔离的线程进行执行
  30. * 3、DispatcherServlet和所有的Filter退出web容器的线程,但是response 保持打开状态;
  31. * 4、Callable返回结果,SpringMVC将请求重新派发给容器,恢复之前的处理;
  32. * 5、根据Callable返回的结果。SpringMVC继续进行视图渲染流程等(从收请求-视图渲染)。
  33. *
  34. * preHandle.../springmvc-annotation/async01
  35. 主线程开始...Thread[http-bio-8081-exec-3,5,main]==>1513932494700
  36. 主线程结束...Thread[http-bio-8081-exec-3,5,main]==>1513932494700
  37. =========DispatcherServlet及所有的Filter退出线程============================
  38. ================等待Callable执行==========
  39. 副线程开始...Thread[MvcAsync1,5,main]==>1513932494707
  40. 副线程开始...Thread[MvcAsync1,5,main]==>1513932496708
  41. ================Callable执行完成==========
  42. ================再次收到之前重发过来的请求========
  43. preHandle.../springmvc-annotation/async01
  44. postHandle...(Callable的之前的返回值就是目标方法的返回值)
  45. afterCompletion...
  46. 异步的拦截器:
  47. 1)、原生API的AsyncListener
  48. 2)、SpringMVC:实现AsyncHandlerInterceptor;
  49. * @return
  50. */
  51. @ResponseBody
  52. @RequestMapping("/async01")
  53. public Callable<String> async01(){
  54. System.out.println("主线程开始..."+Thread.currentThread()+"==>"+System.currentTimeMillis());
  55. Callable<String> callable = new Callable<String>() {
  56. @Override
  57. public String call() throws Exception {
  58. System.out.println("副线程开始..."+Thread.currentThread()+"==>"+System.currentTimeMillis());
  59. Thread.sleep(2000);
  60. System.out.println("副线程开始..."+Thread.currentThread()+"==>"+System.currentTimeMillis());
  61. return "Callable<String> async01()";
  62. }
  63. };
  64. System.out.println("主线程结束..."+Thread.currentThread()+"==>"+System.currentTimeMillis());
  65. return callable;
  66. }
  67. }

发表评论

表情:
评论列表 (有 0 条评论,303人围观)

还没有评论,来说两句吧...

相关阅读

    相关 使用DeferredResult异步处理请求

         我们在实际开发的过程中,可能会遇到需要长轮循的情况。      长轮询指的是客户端向服务端发送一个请求,然后服务端将该请求hold住,另起线程进行处理,处理完后,再