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

26
据我所知,Java Servlet可以同时处理多个请求,并且我已经在StackOverflow和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");

    }
}

我同时打开了两个浏览器窗口,访问了我的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方法上执行了与上述相同的操作,而且它也是一样的。

有什么指针吗?

谢谢


1
你的浏览器可能会将请求串行化,如果你尝试从两台不同的计算机或使用两个不同的浏览器(例如IE和Firefox)进行操作,会发生什么?你还可以检查HTTP访问日志,以查看请求是否同时到达你的servlet容器。 - rsp
你能展示一下 web.xml 和(假设是 tomcat 的话)server.xml 文件吗? - beny23
@beny:我不确定这对于理解问题的原因有多大帮助。你能详细说明一下吗? - BalusC
@BalusC:只是为了完整性而已,也许只有一个工作线程(由于日志类别http-8383-Processor14和22不太可能),或者在web.xml中有一些奇特的过滤器... - beny23
1个回答

39

你的浏览器似乎在不同的窗口中使用了相同的HTTP连接。Servlet容器每个HTTP连接只使用一个线程,而不是每个HTTP请求使用一个线程。你应该使用两个物理不同的网络浏览器来适当地测试这个问题。例如,一个Firefox和一个Chrome。


你为什么认为这里使用了每个连接单线程的方法?这两个请求由不同的线程处理,难道服务器实际上采用了每个请求单线程的策略,而客户端使用相同的TCP连接而没有使用HTTP流水线技术(因此被浏览器排队)吗?这可以解释尽管涉及不同的线程,但为什么会出现顺序处理的情况。 - Luigi Cortese
@BalusC:与其在这个主题上浪费时间,我考虑开一个单独的主题来讨论这个问题。请参见- http://stackoverflow.com/questions/37360731/how-does-a-servlet-container-synchronise-access-for-multiple-requests-to-a-parti - Farhan stands with Palestine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接