在servlet中异步编辑文本文件

时间:2015-09-23 11:52:10

标签: java file servlets asynchronous

我正在基于我的servlet的HttpServletResponse方法中的某个doPost编辑文本文件。使用firefox海报,当我发布请求时,应该编辑该文件。

protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
   JSONObject obj = myrequesthandler.handleRequest(request);
   editTextfile(obj);
}

我希望这种方式能够以这样的方式工作:在完全编辑文件之前,我的servlet不再接受任何帖子请求。它应该等待编辑完成第一个,然后开始编辑第二个帖子请求。

1 个答案:

答案 0 :(得分:0)

由于您使用的是servlet 3.0,我认为这就是您所需要的。

从这篇文章:http://www.javaworld.com/article/2077995/java-concurrency/asynchronous-processing-support-in-servlet-3-0.html

@WebServlet(name="myServlet", urlPatterns={"/slowprocess"}, asyncSupported=true)
public class MyServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) {
        AsyncContext aCtx = request.startAsync(request, response); 
        ServletContext appScope = request.getServletContext();
        ((Queue<AsyncContext>)appScope.getAttribute("slowWebServiceJobQueue")).add(aCtx);
    }
}

@WebServletContextListener
public class SlowWebService implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        Queue<AsyncContext> jobQueue = new ConcurrentLinkedQueue<AsyncContext>();
        sce.getServletContext().setAttribute("slowWebServiceJobQueue", jobQueue);
        // pool size matching Web services capacity
        Executor executor = Executors.newFixedThreadPool(10);
        while(true)
        {
            if(!jobQueue.isEmpty())
            {
                final AsyncContext aCtx = jobQueue.poll();
                executor.execute(new Runnable(){
                    public void run() {
                        ServletRequest request = aCtx.getRequest();
                        // get parameteres
                        // invoke a Web service endpoint
                        // set results
                        aCtx.forward("/result.jsp");
                    }                    
                });             
            }
        }
    }

    public void contextDestroyed(ServletContextEvent sce) {
    }
}