zoukankan      html  css  js  c++  java
  • Spring Security构建Rest服务-0500-异步处理rest服务

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

  • 相关阅读:
    scala :: , +:, :+ , ::: , ++ 的区别
    Scala 函数式编程思想
    Scala 关键字
    HDFS 的内存存储是什么?
    LRU
    高并发情况限流
    Java中List集合去除重复数据的方法
    MySQL支持的跨库事务
    死磕ConcurrentHashMap 1.8源码解析
    一致性Hash算法
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/8478883.html
Copyright © 2011-2022 走看看