上一篇 <<<SpringMVC拦截器的用法
下一篇 >>>SpringMVC适配器类型汇总
异步调用方式一:
a、service上加上注解@Async
b、在配置类上开启注解@EnableAsync
响应:
1.UserController的get方法执行开始,http-nio-8180-exec-6
4.UserController的get方法执行结束,http-nio-8180-exec-6
5.响应结果:null
2.MemberServcie的get方法调用开始,SimpleAsyncTaskExecutor-1
3.MemberServcie的get方法调用结束,SimpleAsyncTaskExecutor-1
存在问题:
a、线程不安全
b、不能及时拿到结果
c、消耗CPU资源
@ResponseBody
@RequestMapping("/test3")
public String get(){
System.out.println("1.UserController的get方法执行开始,"+Thread.currentThread().getName());
String s = memberService.get();
System.out.println("4.UserController的get方法执行结束,"+Thread.currentThread().getName());
System.out.println("5.响应结果:"+s);
return s;
}
异步调用方式二:
a、service上去掉注解@Async
b、配置类上去掉注解@EnableAsync
c、defaultServlet.setAsyncSupported(true);
响应:
1.UserController的get方法执行开始,http-nio-8180-exec-5
4.UserController的get方法执行结束,http-nio-8180-exec-5
5.响应结果:com.jarye.controller.UserController$1@362c3cea
2.MemberServcie的get方法调用开始,MvcAsync1
3.MemberServcie的get方法调用结束,MvcAsync1
优点:
1、能够拿到异步线程结果
2、能够让耗时的时间,交给单独线程处理
如果想完全异步不等待,可以通过主动查询方式获取结果,
比如会员服务调用订单服务时完全异步,直接响应给客户端,后续主动查询订单服务的结果
@ResponseBody
@RequestMapping("/test4")
public Callable<String> get2(){
System.out.println("1.UserController的get方法执行开始,"+Thread.currentThread().getName());
Callable<String> callable = new Callable<String>() {
public String call() throws Exception {
String s = memberService.get();
return s;
}
};
System.out.println("4.UserController的get方法执行结束,"+Thread.currentThread().getName());
System.out.println("5.响应结果:"+callable);
return callable;
}
推荐阅读:
<<<Spring Servlet相关知识
<<<Spring原理汇总及零碎知识点
<<<Web项目的启动方式汇总
<<<SpringMVC底层无web.xml启动原理分析
<<<SpringMVC运行流程
<<<DispatcherServlet执行原理分析
<<<过滤器与拦截器的区别
<<<SpringMVC拦截器的用法
<<<@Async注解的失效之谜
<<<SpringMVC适配器类型汇总