【问题标题】:How do I send large (over 64k) http responses from a java servlet in a jetty server?如何从码头服务器中的 java servlet 发送大型(超过 64k)http 响应?
【发布时间】:2013-12-11 19:22:37
【问题描述】:

我正在使用 Jetty 服务器,并且有一个 servlet 可以产生超过 65536 字节大小的大响应。我尝试使用 curl、wget 和 python urllib2 来请求 servlet 的 url 处的内容,但所有响应体的截断大小仅为 65536 字节,这让我相信限制在服务器上。有趣的是,如果我在桌面而不是生产服务器上运行服务器,对于同一个 servlet 的响应大小似乎没有 65536 的上限。有人可以解释为什么会发生这种情况以及我如何解决它并发送更大的回复吗?

【问题讨论】:

  • 您有content-length 标头吗?它指定的数字是否比 65536 大得多?
  • 没有内在限制。这是一个(旧的!)错误报告:jira.codehaus.org/browse/JETTY-200 - “在 6.0.1 中出现一个完整缓冲区未触发刷新的问题。”问:你碰巧在使用 Jetty 6.0.1 吗?问:您究竟是如何发送数据的?你能给我们看看代码吗?
  • 在生产中,是否有像 Apache 这样的代理服务器在 Jetty 前面可能被配置为截断响应?
  • 发现问题。读取和写入请求输入流和响应输出流的空闲超时非常低。因此,大于 1 个块(在本例中为 65536 字节)的响应在写入第二个块之前阻塞写入调用的时间超过了这个低超时时间。这就是为什么本地机器上没有出现问题的原因——因为请求是本地的,它没有达到超时。在我们的例子中,解决方案不是为涉及需要发送大量数据的 servlet 的请求和响应设置如此低的超时时间。

标签: java servlets jetty


【解决方案1】:

Jetty 的响应大小没有限制。

它可以流式传输单个 HTTP 分块编码响应,直到宇宙热死为止。

jetty-distribution 附带一个演示库(或带有旧版本 jetty 的“测试 web 应用程序”),其中有几个兆字节的示例供您测试。

为您的 servlet 发布一些代码,这可能会揭示正在发生的事情。

【讨论】:

    【解决方案2】:

    自我回答,让问题有答案。来自 cmets:

    发现问题。读取和写入请求输入流和响应输出流的空闲超时非常低。因此,大于 1 个块(在本例中为 65536 字节)的响应在写入第二个块之前阻塞写入调用的时间超过了这个低超时时间。这就是为什么本地机器上没有出现问题的原因——因为请求是本地的,它没有达到超时。在我们的例子中,解决方案是不要为涉及需要发送大量数据的 servlet 的请求和响应设置如此低的超时时间。

    【讨论】:

      猜你喜欢
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多