首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >异步Servlet -首选实现

异步Servlet -首选实现
EN

Stack Overflow用户
提问于 2014-04-23 17:40:09
回答 1查看 911关注 0票数 4

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

问题是:

recommended?

  • Maybe
  1. 哪一种是最好的?

也许这些方法中有一些不是最好的,还有一种方法比下面提到的所有方法都更好吗?

找到方法:

使用AsyncContext.start(Runnable)

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

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

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

使用EJB@Asynchronious注释的

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

我很高兴听到您对这个问题的看法和您使用AsyncContext的经验。

EN

回答 1

Stack Overflow用户

发布于 2018-08-24 05:48:31

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

下面你会发现一个简单的实现:

@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");
    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23240497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档