Servlet 似乎同步处理多个并发浏览器请求

Posted

技术标签:

【中文标题】Servlet 似乎同步处理多个并发浏览器请求【英文标题】:Servlet seems to handle multiple concurrent browser requests synchronously 【发布时间】:2011-12-22 02:33:32 【问题描述】:

据我所知,Java Servlet 正在同时处理多个请求,我已经通过 *** 和 Google 进行了搜索,并确认了我的想法。但是我现在很困惑,我编写了一个简单的 servlet,似乎显示了阻塞行为。

所以我有一个简单的 Servlet:

public class MyServlet extends HttpServlet 

    private static final long serialVersionUID = 2628320200587071622L;

    private static final Logger logger = Logger.getLogger(MyServlet.class);

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
    
        logger.info("[doGet] Test before");

        try 
            Thread.sleep(60000);
         catch (InterruptedException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
        logger.info("[doGet] Test after");

        resp.setContentType("text/plain");
        resp.getWriter().write("OK");

    

然后我有 2 个浏览器窗口,我同时打开了我的 Servlet。 结果是第一个请求阻塞了第二个请求。日志还显示:

10:49:05,088 [http-8383-Processor14]  INFO MyServlet - [doGet] Test before
10:50:05,096 [http-8383-Processor14]  INFO MyServlet - [doGet] Test after
10:50:05,106 [http-8383-Processor22]  INFO MyServlet - [doGet] Test before
10:51:05,112 [http-8383-Processor22]  INFO MyServlet - [doGet] Test after

我觉得我错过了一些东西...... Servlet 应该能够处理并发请求,但它似乎没有这样做。我也在 service 方法上做了同样的事情,而不是 doGet,它做同样的事情。

任何指针?

谢谢

【问题讨论】:

您的浏览器可能会序列化请求,如果您从 2 台不同的计算机或使用 2 种不同的浏览器尝试此操作会发生什么? (即 iexploere 和 firefox)您还可以检查 http 访问日志以查看请求是否同时到达您的 servlet 容器。 你能显示web.xml和(假设这是tomcat)server.xml吗? @beny:我不确定这对理解问题的原因有多大帮助。你能详细说明一下吗? @BalusC:只是为了完整性,也许只有一个工作线程(不太可能是由于日志类别 http-8383-Processor14 和 22),或者 web.xml 中的一些深奥的过滤器... 【参考方案1】:

您的浏览器显然在不同的窗口中使用相同的 HTTP 连接。 servlet 容器对每个 HTTP 连接使用一个线程,而不是每个 HTTP 请求。您应该运行两个物理上不同的网络浏览器来正确测试它。例如。一台 Firefox 和一台 Chrome。

【讨论】:

是什么让您认为这里使用了单线程连接?这两个请求由不同的线程处理,难道不是服务器实际上采用了单线程每个请求策略,而在客户端使用相同的TCP连接而没有HTTP流水线(浏览器排队)?这将解释尽管涉及不同线程的顺序处理 @BalusC:我没有考虑污染这个线程,而是考虑为此提出一个单独的线程。请看-***.com/questions/37360731/…

以上是关于Servlet 似乎同步处理多个并发浏览器请求的主要内容,如果未能解决你的问题,请参考以下文章

想玩转JAVA高并发,这些概念你必须懂

如何设置servlet中并发请求数的限制?

Servlet的请求处理

servlet 小知识

Servlet概念

Servlet请求和响应和Cookie