异步处理REST服务:
1,使用Runnable异步处理Rest服务
2,使用DeferredResult异步处理Rest服务
3,异步处理配置
异步处理能提高服务器的吞吐量。
一、使用Runnable异步处理Rest服务
模拟下单:
package com.imooc.web.asyn; import java.util.concurrent.Callable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * * ClassName: AsynController * @Description: TODO * @author lihaoyang * @date 2018年2月27日 */ @RestController public class AsynController { private Logger logger = LoggerFactory.getLogger(getClass()); @RequestMapping("/order") public Callable<String> order() throws Exception{ System.err.println("-------进入AsynController------"); logger.info("主线程开始"); Callable<String> result = new Callable<String>() { @Override public String call() throws Exception { logger.info("++ 副线程开始"); Thread.sleep(1000); logger.info("++ 副线程返回"); return "success"; } }; logger.info("主线程返回"); return result; } }
日志:
2018-02-27 14:47:22.473 INFO 584 --- [nio-8080-exec-1] com.imooc.web.asyn.AsynController : 主线程开始
-------进入AsynController------
2018-02-27 14:47:22.473 INFO 584 --- [nio-8080-exec-1] com.imooc.web.asyn.AsynController : 主线程返回
2018-02-27 14:47:22.479 INFO 584 --- [ MvcAsync1] com.imooc.web.asyn.AsynController : ++ 副线程开始
2018-02-27 14:47:23.479 INFO 584 --- [ MvcAsync1] com.imooc.web.asyn.AsynController : ++ 副线程返回
可以看到,主线程立刻就返回了,任务由副线程去执行了,这1秒期间主线程(tomcat)可以去处理其他http请求,因此可以提高服务器吞吐量。
这种情况也是有限制的,副线程必须是由主线程调起的,副线程代码是写在主线程里的。实际场景可能用到的要比这个复杂:
模拟下单
1,服务器1 的 线程1 接收下单请求,接收到下单请求后,放在了消息队列,
2,服务器2监听消息队列,有下单请求后处理下单,下单完成后,处理结果又放在了消息队列
3,服务器1的 线程2 监听下单结果,有下单完成消息,返回给http
此时线程1和线程2不在一块,是隔离的,谁也不知道对方的存在,就没办法用Runnable了,此时就需要用DeferredResult来处理。
欢迎关注个人公众号一起交流学习: