Finishing a HttpServletResponse but continue processing

痴心易碎 提交于 2019-12-04 19:51:19

问题


I have a situation that seems to fit the Async Servlet 3.0 / Comet situation but all I need to do is return a 200 response code (or other) after accepting the incoming parameters.

Is there a way for a HttpServlet to complete the http request/response handshake and yet continue processing?

Something like...

doPost( req, response ) {
   // verify input params...
   response.setStatus( SC_OK );
   response.close();
   // execute long query
}     

EDIT: Looking at the javax.servlet package - the proper phrasing to my question is

How do I commit a response?

as in Servlet.isCommitted()


回答1:


Here's how I've handled this situation:

  1. When the app starts up, create an ExecutorService with Executors.newFixedThreadPool(numThreads) (there are other types of executors, but I suggest starting with this one)
  2. In doPost(), create an instance of Runnable which will perform the desired processing - your task - and submit it to the ExecutorService like so: executor.execute(task)
  3. Finally, you should return the HTTP Status 202 Accepted, and, if possible, a Location header indicating where a client will be able to check up on the status of the processing.

I highly recommend you read Java Concurrency in Practice, it's a fantastic and very practical book.




回答2:


On possibility for your servlet to accept a request for processing in the background, is for the servlet to hand off processing to a separate thread which then executes in the background.

Using Spring, you can invoke a separate Thread using the a TaskExecutor. The advantage of using spring over standard JDK 5 java.util.concurrent.Executor is that if you're on application servers that need to use managed threads (IBM websphere or Oracle weblogic), you can use the WorkManagerTaskExecutor to hook into the CommonJ work managers.

Another alternative would be to move the long query logic into a Message Driven Bean or Message Driven POJO (Spring JMS can help here) and let the servlet simply post a message on a JMS queue. That would have the advantage that should the load on your web container become too great because of your long running query, you could easily move the MDB onto a different (dedicated) system.




回答3:


You can continue processing in a separate Thread.

The response is commited once you return from doPost() method.




回答4:


This example can help

void doPost(){
    // do something
   final ExecutorService executor = Executors.newSingleThreadExecutor();
      executor.execute(new Runnable() {
          @Override
          public void run() {
              // processing after response
          }
      });}


来源:https://stackoverflow.com/questions/2367650/finishing-a-httpservletresponse-but-continue-processing

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!