异步处理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来处理。

 

 

欢迎关注个人公众号一起交流学习: