• SpringMVC的Action在同一时间里只允许同一个浏览器的单次进入?


    最近用SpringMVC写了一个很简单的测试程序,代码如下:

    @Controller
    public class LongTimeTaskController {
        @RequestMapping(value = "/sleep", method = RequestMethod.GET)
        public ModelAndView sleepTest(){
            System.out.println(" begin sleep. " + Thread.currentThread().getId());
            try {
                Thread.sleep(15000);
            } catch (InterruptedException e) {
            }
            System.out.println(" end sleep and return. " + Thread.currentThread().getId());
            return new ModelAndView("sleep");
        }
    }

    这个sleepTest()的Action意图很明确,对它的调用将sleep 15秒钟再返回。接下来我用Chrome打开多个tab,打入“http://localhost:8080/sleep”进行访问,很快我发现了个奇怪的现象,那就是标题所描述的那样,sleepTest()这个Action同一时间里只有一个线程在跑,也就是说,如果我几乎同时让A、B、C三个Tab打开这个地址(事实上,A略微先于B,B略微先于C),我就观察到,A成功返回的时候(看到“ end sleep and return.”),B才开始进入(看到“ begin sleep.”),B成功返回的时候C才开始进入,等到C成功返回的时候一共花了不下45秒钟,很奇怪!

    难道不支持多线程吗?我把执行它们的线程ID打印了出来,发现是不同的线程,接下来进一步研究发现了:

    1,sleep阻塞的时候,对别的Action的访问并不受影响
    2,如果启动别的浏览器,访问sleep,也不会被阻塞

    这看起来像是SpringMVC的限制,因为这跟是否访问同一个Action有关,但实在搞不懂为什么要这样,最好就是Google一下,这种问题如果存在,问的人应该很多,但很遗憾,Google不到任何相关内容。

    后来想想,干嘛不用Postman试试看呢?一尝试,惊奇地发现Postman没有这个问题,我的天,这竟然是浏览器的限制?答案是肯定的,接下来我很快发现了IE并没有这个限制,这个奇怪的限制只在Chrome上出现了,要证明很简单,用Wireshark抓一下包即可。

    Chrome的限制规则是:浏览器同时只能对同一个URL提出一个请求,如果有更多的请求的话,对不起,请排队。这个所谓“限制”到底好不好?可能不错,想想对同一URL的请求,如果前请求阻塞,那么后请求想必也会被阻塞,这无端增加了开销,并没多大意义,Chrome这么做应该有它的合理性。

  • 相关阅读:
    多线程
    带缓存的字符输入输出流
    输入输出流(I/O)
    课本235页2-3题
    包装&工具类
    集合类SetMap
    tp框架之增删改查
    tp框架之数据添加
    tp框架之查询
    tp框架之Model类与命名空间
  • 原文地址:https://www.cnblogs.com/guogangj/p/5238915.html
Copyright © 2020-2023  润新知