1

I am confused with Async feature introduced in Servlet 3.0 spec

From Oracle site (http://docs.oracle.com/javaee/7/tutorial/doc/servlets012.htm):

To create scalable web applications, you must ensure that no threads associated with a request are sitting idle, so the container can use them to process new requests.

There are two common scenarios in which a thread associated with a request can be sitting idle.

1- The thread needs to wait for a resource to become available or process data before building the response. For example, an application may need to query a database or access data from a remote web service before generating the response.

2- The thread needs to wait for an event before generating the response. For example, an application may have to wait for a JMS message, new information from another client, or new data available in a queue before generating the response.

The first item happens a lot (nearly always, we always query db or call a remote webservice to get some data). And calling an external resource will always consume some time.

Does it mean that we should ALWAYS use servelt async feature for ALL our servelts and filter ?! I can ask this way too, if I write all my servelts and filters async, will I lose anything (performance)?!

If above is correct the skeleton of ALL our servlets will be:

public class Work implements ServletContextListener {
  private static final BlockingQueue queue = new LinkedBlockingQueue();

  private volatile Thread thread;

      @Override
      public void contextInitialized(ServletContextEvent servletContextEvent) {
        thread = new Thread(new Runnable() {
          @Override
          public void run() {
            while (true) {
              try {
                ServiceFecade.doBusiness();
                AsyncContext context;
                while ((context = queue.poll()) != null) {
                  try {
                    ServletResponse response = context.getResponse();
                    PrintWriter out = response.getWriter();
                    out.printf("Bussiness done");
                    out.flush();
                  } catch (Exception e) {
                    throw new RuntimeException(e.getMessage(), e);
                  } finally {
                    context.complete();
                  }
                }
              } catch (InterruptedException e) {
                return;
              }
            }
          }
        });
        thread.start();
      }

      public static void add(AsyncContext c) {
        queue.add(c);
      }

      @Override
      public void contextDestroyed(ServletContextEvent servletContextEvent) {
        thread.interrupt();
      }
    }
Mattias Backman
  • 927
  • 12
  • 25
Alireza Fattahi
  • 42,517
  • 14
  • 123
  • 173
  • I find it duplicated with http://stackoverflow.com/questions/2162783/asynchronous-servlets-vs-synchronous-servlets :) More information are appreciated ! – Alireza Fattahi Jun 25 '14 at 10:35

0 Answers0