【问题标题】:Servlet - close connection but not methodServlet - 关闭连接但不是方法
【发布时间】:2014-08-20 18:39:15
【问题描述】:

我必须实现将在每个连接上发送204 代码但不关闭线程的服务(servlet 2.5 或 3)。 我需要对收到的数据做一些处理(比如打开新连接)。

可以关闭连接但不能结束方法?还是在连接关闭时启动另一个方法?

【问题讨论】:

  • 想启动一个新线程来执行额外的处理?
  • 是的,但首先必须发送 204,然后是操作。使用新线程是问题,因为可以先运行操作。
  • 不,它将并行运行。您可以设置延迟,例如 2 秒后运行。

标签: java servlets


【解决方案1】:

规范中并不清楚,但它似乎在 Tomcat 7.0 中工作。

从 servlet 3.0 的规范中摘录:

响应对象的关闭
当响应关闭时,容器必须立即刷新所有剩余的 客户端的响应缓冲区中的内容。以下事件表明 servlet 已满足请求并且响应对象将被关闭:

  • servlet 的服务方法终止。
  • 响应的 setContentLength 方法中指定的内容量 已大于零并已写入响应。
  • 调用了 sendError 方法。
  • 调用了 sendRedirect 方法。
  • 调用了 AsyncContext 上的完整方法。

根据我在 tomcat 7.0.32 上的测试,当 ContentLength 设置为 0 并且关闭输出流时,Http 连接在 servlet 的 service 方法结束之前关闭。

因此,根据您的要求,您可以在 servlet 中尝试以下操作:

response.setStatus(HttpServletResponse.SC_NO_CONTENT);
response.setContentLength(0);
response.getOutputStream().close();
// continue after connection with client is closed

但是注意我在规范中找不到任何确认,因此它不能与另一个容器一起使用。

【讨论】:

    【解决方案2】:
    @Override
    protected void doPost(final HttpServletRequest req, final HttpServletResponse resp)
            throws ServletException {
            //Send 204 back
            resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
            // Continue with you logic here
            .
            .
            .
            .
    

    【讨论】:

      猜你喜欢
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      相关资源
      最近更新 更多