获取重置缓冲区jetty异常

时间:2016-08-26 08:15:39

标签: spring jetty spring-web

我正在使用带有jetty的Spring的DeferredResult(版本:9.3.11.v20160721)并收到此错误。

java.lang.IllegalStateException: cannot reset buffer on committed response
        at org.eclipse.jetty.server.Response.resetBuffer(Response.java:1245)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:371)
        at org.eclipse.jetty.server.HttpChannel.run(HttpChannel.java:266)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)
        at java.lang.Thread.run(Unknown Source)

我做了谷歌,它告诉我在同一请求上发送了两次回复,但我在设置任何回复之前都进行了检查,因此不应该发生这种可能性。

private DeferredResult<Object> result = new DeferredResult<>(10000);

  private void checkAndSend(Object res) {
    if (result.isSetOrExpired()) {
      log.warn("DeferredResult set/expired for res: {}", res);
      return;
    }
    ... // respsond
}

有人请帮帮我。

1 个答案:

答案 0 :(得分:0)

您遇到错误,HttpServletResponse现在处于错误状态。

Jetty servlet引擎试图将错误报告给HTTP。 它做的第一件事是重置缓冲区,以便它可以设置状态和消息以发送错误响应。

但由于响应已经提交,因此无法重置缓冲区。 (其他东西已经开始在该连接上发送响应)