【问题标题】:Async Servlet - preferred implementation异步 Servlet - 首选实现
【发布时间】:2014-04-23 09:40:09
【问题描述】:

最近在Servlets研究异步处理时,我至少遇到了三种实现方式 使用这种方法的一些功能。

问题是:

  1. 哪个最好?
  2. 也许不推荐其中一些方法?
  3. 也许还有另一种方法比下面提到的所有方法都更好?

找到的方法:

  1. 使用AsyncContext.start(Runnable)

    这种方法非常简单明了。但是许多服务器在为HTTP 请求创建的线程池中执行这样的工作 (更多信息在这里http://www.nurkiewicz.com/2012/05/javaxservletservletrequeststartasync.html

  2. 使用在 Servlet 上下文初始化期间创建的自定义线程池

    (此处示例:http://www.journaldev.com/2008/async-servlet-feature-of-servlet-3)。 但是我可以在 Servlet 容器中创建自己的线程吗?在EJB(之前JavaEE7)中不推荐(甚至禁止)。 我可以使用JavaSE Executors 还是应该使用JavaEE7 中的ManagedExecutors(假设我使用JavaEE7)?

  3. 使用EJB@Asynchronious注解

    (此处示例:https://github.com/wildfly/quickstart/tree/master/servlet-async/src/main/java/org/jboss/as/quickstarts/servlet/async)。 但是在这里我无法控制执行我的任务的线程(即应该创建多少线程等)

我很高兴听到您对此问题的看法以及您对AsyncContext 的体验。

【问题讨论】:

    标签: servlets asynchronous java-ee-6 servlet-3.0 java-ee-7


    【解决方案1】:

    所有都将具有相同的性能,在后端所有线程都将请求处理线程替换为另一个线程,以便可以处理更多请求。

    您将在下面找到一个简单的实现:

    @WebServlet(urlPatterns = "/AsyncLongRunningServlet", asyncSupported = true)
    public class AsyncLongRunningServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
            System.out.println("Request Processing Thread "+Thread.currentThread().getName());
    
            request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);
            response.setContentType("text/html");
            PrintWriter printWriter=response.getWriter();
            printWriter.println("<html><head><title>Asynchronous servlet</title></head><body>");
            printWriter.println("Request Processing Thread "+Thread.currentThread().getName());
            printWriter.println("<br>");
            printWriter.println("<progress id='progress' max='100')></progress>");
            printWriter.println("<br>");
    
            AsyncContext asyncCtx = request.startAsync();
            asyncCtx.addListener(new AppAsyncListener());
            asyncCtx.setTimeout(12000);
            //release of request processing thread
            asyncCtx.start(() ->{
                printWriter.println("<br>");
                printWriter.println("Async thread Name "+Thread.currentThread().getName());
                printWriter.println("<br>");
    
                int i=0;
                while(i<100)
                {
                    printWriter.println("<script>document.getElementById('progress').value=\""+i+"\";</script>");
                    printWriter.flush();
                    try {
                        Thread.sleep(100);
                    } catch (Exception e) {
                    }
                    i++;
                }
                printWriter.println("</body></html>");
                asyncCtx.complete();
            }
    
        );
            printWriter.println("<br>");
            printWriter.println("End of response");
        }
    
    }
    
    
    
    package com.journaldev.servlet.async;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.AsyncEvent;
    import javax.servlet.AsyncListener;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebListener;
    
    @WebListener
    public class AppAsyncListener implements AsyncListener {
    
        @Override
        public void onComplete(AsyncEvent asyncEvent) throws IOException {
            System.out.println("AppAsyncListener onComplete");
            // we can do resource cleanup activity here
        }
    
        @Override
        public void onError(AsyncEvent asyncEvent) throws IOException {
            System.out.println("AppAsyncListener onError");
            //we can return error response to client
        }
    
        @Override
        public void onStartAsync(AsyncEvent asyncEvent) throws IOException {
            System.out.println("AppAsyncListener onStartAsync");
            //we can log the event here
        }
    
        @Override
        public void onTimeout(AsyncEvent asyncEvent) throws IOException {
            System.out.println("AppAsyncListener onTimeout");
            //we can send appropriate response to client
            ServletResponse response = asyncEvent.getAsyncContext().getResponse();
            PrintWriter out = response.getWriter();
            out.write("TimeOut Error in Processing");
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多