前言:
此刻朋友们对“springmvc 异步”大致比较珍视,我们都想要学习一些“springmvc 异步”的相关知识。那么小编同时在网络上搜集了一些对于“springmvc 异步””的相关知识,希望大家能喜欢,咱们快快来了解一下吧!应用服务器的连接线程池实际上是有限制的;每一个连接请求都会耗掉线程池的一个连接数;如果某些耗时很长的操作,如对大量数据的查询操作、调用外部系统提供的服务以及一些IO密集型操作等,会占用连接很长时间,这个时候这个连接就无法被释放而被其它请求重用。如果连接占用过多,服务器就很可能无法及时响应每个请求;极端情况下如果将线程池中的所有连接耗尽,服务器将长时间无法向外提供服务。
1.callable方式
@Controller@RequestMapping("/async/controller")public class AsyncHelloController { @ResponseBody @GetMapping("/hello") public Callable<String> helloGet() throws Exception { System.out.println(Thread.currentThread().getName() + " 主线程start"); Callable<String> callable = () -> { System.out.println(Thread.currentThread().getName() + " 子子子线程start"); TimeUnit.SECONDS.sleep(5); //模拟处理业务逻辑,话费了5秒钟 System.out.println(Thread.currentThread().getName() + " 子子子线程end"); // 这里稍微小细节一下:最终返回的不是Callable对象,而是它里面的内容 return "hello world"; }; System.out.println(Thread.currentThread().getName() + " 主线程end"); return callable; } }
执行结果:http-apr-8080-exec-3 主线程starthttp-apr-8080-exec-3 主线程endMvcAsync1 子子子线程startMvcAsync1 子子子线程end
异步模式处理步骤概述如下:
1.当Controller返回值是Callable的时候Spring就会将Callable交给TaskExecutor去处理(一个隔离的线程池)
2.与此同时将DispatcherServlet里的拦截器、Filter等等都马上退出主线程,但是response仍然保持打开的状态Callable线程处理完成后,
3.Spring MVC讲请求重新派发给容器**(注意这里的重新派发,和后面讲的拦截器密切相关)**根据Callabel返回结果,继续处理(比如参数绑定、视图解析等等就和之前一样了)~~~~
标签: #springmvc 异步