Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Servlet seems to handle multiple concurrent browser requests synchronously

Tags:

As far as I know Java Servlets are handling multiple requests concurrently and I've searched through StackOverflow as well as Google, and confirmed what I thought. However I am quite confused right now, I wrote a simple servlets that seem to show blocking behaviour.

so I have a simple 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");      } } 

Then I have 2 browser windows, I opened at the same time that hit my Servlet. And the result is the first request blocking the 2nd one. The log also shows:

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 

I feel like I am missing something ... Servlets supposed to be able to handle concurrent request, but it doesnt seem to be doing it. I also did the same as above on the service method instead of doGet and it does the same thing.

Any pointers?

Thanks

like image 516
iamoverflown Avatar asked Nov 04 '11 14:11

iamoverflown


People also ask

How servlets handle multiple requests concurrently?

A servlet is a singleton, and is shared among all the requests. Each request is served by a thread, and concurrent requests are thus served by concurrent threads, each calling the same servlet concurrently.

How can you handle simultaneous requests to a servlet?

A Java servlet container / web server is typically multithreaded. That means, that multiple requests to the same servlet may be executed at the same time. Therefore, you need to take concurrency into consideration when you implement your servlet.

How do you handle multiple requests at the same time in Java?

Your best option is to use ExecuterService which is kind of managed thread pool where you can specify thread pool size and submit multiple Runnable or Callable objects for processing.

How many servlet instances are created when multiple requests arrive simultaneously?

Regardless of the number of request only one instance of Servlet will be created by the container per servlet per jvm.


1 Answers

Your browser is apparently using the same HTTP connection in different windows. The servlet container uses a single thread per HTTP connection, not per HTTP request. You should run two physically different webbrowsers to test this properly. E.g. one Firefox and one Chrome.

like image 59
BalusC Avatar answered Oct 30 '22 05:10

BalusC