据我所知,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上执行的操作相同。
有指针吗?
谢谢
您的浏览器显然在不同的窗口中使用相同的HTTP连接。Servlet容器针对每个HTTP连接而不是针对HTTP请求使用单个线程。您应该运行两个物理上不同的Web浏览器来正确测试。例如,一个Firefox和一个Chrome。