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 get2(){
    System.out.println("1.UserController的get方法执行开始,"+Thread.currentThread().getName());
    Callable callable = new Callable() {
        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;
}

推荐阅读:
<< << << << << << <<<过滤器与拦截器的区别
<< <<<@Async注解的失效之谜
<<

你可能感兴趣的:(SpringMVC异步实现方式)