Multithreading 在Servlet3.0WebServer上,使所有servlet和过滤器异步好吗?

Multithreading 在Servlet3.0WebServer上,使所有servlet和过滤器异步好吗?,multithreading,servlets,asynchronous,servlet-filters,servlet-3.0,Multithreading,Servlets,Asynchronous,Servlet Filters,Servlet 3.0,我对Servlet3.0规范中引入的异步特性感到困惑 从Oracle站点: 要创建可伸缩的web应用程序,必须确保没有线程 与请求关联的容器处于空闲状态,因此容器可以使用 让他们处理新的请求 有两种常见的场景,其中线程与 请求可以闲置 1-在生成响应之前,线程需要等待资源可用或处理数据。例如,一个应用程序 可能需要查询数据库或从远程web服务访问数据 在生成响应之前 2-线程需要在生成响应之前等待事件。例如,应用程序可能必须等待JMS 消息、来自其他客户端的新信息或中可用的新数据 生成响应之前的

我对Servlet3.0规范中引入的异步特性感到困惑

从Oracle站点:

要创建可伸缩的web应用程序,必须确保没有线程 与请求关联的容器处于空闲状态,因此容器可以使用 让他们处理新的请求

有两种常见的场景,其中线程与 请求可以闲置

1-在生成响应之前,线程需要等待资源可用或处理数据。例如,一个应用程序 可能需要查询数据库或从远程web服务访问数据 在生成响应之前

2-线程需要在生成响应之前等待事件。例如,应用程序可能必须等待JMS 消息、来自其他客户端的新信息或中可用的新数据 生成响应之前的队列

第一项几乎总是经常发生,我们总是查询数据库或调用远程Web服务来获取一些数据。调用外部资源总是要花费一些时间

这是否意味着我们应该始终为所有的服务和过滤器使用服务异步功能?! 我也可以这样问,如果我把所有的服务和过滤器都写成异步的,我会失去任何性能吗

如果上述内容正确,我们所有servlet的框架将是:

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();
      }
    }
我发现它重复:更多的信息是感激的!