Java 完成HttpServletResponse但继续处理

Java 完成HttpServletResponse但继续处理,java,http,servlets,comet,Java,Http,Servlets,Comet,我有一种情况似乎适合AsyncServlet3.0/Comet的情况,但我需要做的就是在接受传入参数后返回一个200响应代码(或其他) HttpServlet是否有办法完成http请求/响应握手并继续处理 类似于 doPost( req, response ) { // verify input params... response.setStatus( SC_OK ); response.close(); // execute long query } 编辑

我有一种情况似乎适合AsyncServlet3.0/Comet的情况,但我需要做的就是在接受传入参数后返回一个200响应代码(或其他)

HttpServlet是否有办法完成http请求/响应握手并继续处理

类似于

doPost( req, response ) {
   // verify input params...
   response.setStatus( SC_OK );
   response.close();
   // execute long query
}     
编辑:查看javax.servlet包-我的问题的正确措辞是

如何提交响应


与Servlet.isCommitted()一样,您可以在单独的线程中继续处理


doPost()
方法返回后,将提交响应。

servlet接受后台处理请求的可能性是,servlet将处理交给单独的线程,然后在后台执行

使用Spring,您可以使用a调用单独的线程。与标准JDK 5
java.util.concurrent.Executor
相比,使用spring的优势在于,如果您在需要使用托管线程(IBM websphere或Oracle weblogic)的应用程序服务器上,您可以使用
WorkManagerTaskExecutor
连接到CommonJ工作管理器


另一种选择是将长查询逻辑移动到消息驱动Bean或消息驱动POJO中(这里可以提供帮助),并让servlet简单地在JMS队列上发布消息。这样做的好处是,如果由于长时间运行的查询而导致web容器上的负载过大,您可以轻松地将MDB移动到其他(专用)系统上。

以下是我如何处理这种情况的:

  • 当应用程序启动时,创建一个带有
    Executors.newFixedThreadPool(numThreads)
    (还有其他类型的执行器,但我建议从这个类型开始)
  • doPost()
    中,创建一个实例,该实例将执行所需的处理—您的任务—并将其提交给
    ExecutorService
    ,如下所示:
    executor.execute(task)
  • 最后,您应该返回HTTP状态,如果可能的话,还应该返回一个
    位置
    头,指示客户端可以在哪里检查处理状态
  • 我高度推荐你阅读,这是一本非常棒而且非常实用的书。

    这个例子会有所帮助

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

    我遇到了一个URL获取服务,它对来自Google应用程序引擎的完美请求超时5秒。应用程序引擎请求者无需阻止等待OK响应,因为等待OK响应可能需要很长时间才能完成处理。“已提交”表示响应流的某些部分已发送到客户端。它不能收回或修改。理论上,只要您设置了头或写入响应,它就可以发生,但通常情况下,容器缓冲区会延迟一点。我认为这与你无关。不要关闭响应流。只需设置状态,根据其他答案启动一个线程,让doPost()完成。我尝试使用response.senderro(SC_OK),但它仍然没有将响应刷新到请求者。似乎关闭servlet请求的唯一方法是从doPost()返回。虽然我同意所有的响应,但这一响应所涉及的复杂性最小。感谢pajton、beny23和avi的支持。如果我想使用executor.submit()而不是.execute,我该怎么做?我想使用.submit,这样我就可以掌握“未来”并知道所有任务何时完成(基于此,我必须进行某些处理)。您可以对此进行扩展吗?最好不要每次servlet收到请求时都实例化ExecutorService,否则您将开始创建大量永不消亡的线程,至少按照newSingleThreadExecutor()文档。