小编典典

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

java

据我所知,Java
Servlets正在同时处理多个请求,我已经搜索了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");

    }
}

然后,我有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应该能够处理并发请求,但是似乎并没有这样做。我在服务方法上也执行了与上述相同的操作,而不是在doGet上执行的操作相同。

有指针吗?

谢谢


阅读 336

收藏
2020-09-08

共1个答案

小编典典

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

2020-09-08