龙空技术网

Spring MVC的异步请求Callable

非典型程序猿平头哥 422

前言:

此刻朋友们对“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 异步