Jetty 的 httpClient.setResponseBufferSize() 方法有什么作用吗?

2024-01-03

我正在使用 Jetty 的 HttpClient 构建一个简单的代理服务器。我在 Java 1.8.0_45 上使用 Jetty 版本 9.3.10.v20160621。

我遇到过这样的情况:我对资源执行 GET 操作,该资源将返回大小约为 3.5M 的响应(我使用soapUI 确定了这一点)。知道 Jetty 的默认最大响应大小为 2M,我在创建 HttpClient 实例时执行以下操作。

        HttpClient client = new HttpClient();
        client.setResponseBufferSize(4194304);
        client.start();

后来我执行同步 GET 请求,如下所示:

        System.out.println("response buffer size = " + client.getResponseBufferSize());
        retVal = client.GET(uri);

控制台日志有以下内容:

响应缓冲区大小 = 4194304

尽管如此,当我执行 GET() 时,我得到了一个 java.util.concurrent.ExecutionException (下面的堆栈跟踪)。我只能得出这样的结论:(a) setResponseBufferSize() 方法中存在错误,或者 (b) setResponseBufferSize() 方法没有执行文档所说的操作(设置响应缓冲区大小)。有人知道这是怎么回事吗?

java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: Buffering capacity exceeded
    at org.eclipse.jetty.client.util.FutureResponseListener.getResult(FutureResponseListener.java:118)
    at org.eclipse.jetty.client.util.FutureResponseListener.get(FutureResponseListener.java:101)
    at org.eclipse.jetty.client.HttpRequest.send(HttpRequest.java:652)
    at org.eclipse.jetty.client.HttpClient.GET(HttpClient.java:343)
    at oracle.paas.tools.sifter.proxy.ProxySession.get(ProxySession.java:106)
    at oracle.paas.tools.sifter.proxy.Endpoint.doGet(Endpoint.java:75)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:837)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1180)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
    at org.eclipse.jetty.server.Server.handle(Server.java:524)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:319)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136)
    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(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: Buffering capacity exceeded
    at org.eclipse.jetty.client.util.BufferingResponseListener.onContent(BufferingResponseListener.java:114)
    at org.eclipse.jetty.client.api.Response$Listener$Adapter.onContent(Response.java:248)
    at org.eclipse.jetty.client.ResponseNotifier.notifyContent(ResponseNotifier.java:124)
    at org.eclipse.jetty.client.ResponseNotifier.access$100(ResponseNotifier.java:35)
    at org.eclipse.jetty.client.ResponseNotifier$ContentCallback.process(ResponseNotifier.java:272)
    at org.eclipse.jetty.util.IteratingCallback.processing(IteratingCallback.java:241)
    at org.eclipse.jetty.util.IteratingCallback.iterate(IteratingCallback.java:224)
    at org.eclipse.jetty.client.ResponseNotifier.notifyContent(ResponseNotifier.java:117)
    at org.eclipse.jetty.client.HttpReceiver.responseContent(HttpReceiver.java:326)
    at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.content(HttpReceiverOverHTTP.java:256)
    at org.eclipse.jetty.http.HttpParser.parseContent(HttpParser.java:1584)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:1332)
    at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.parse(HttpReceiverOverHTTP.java:158)
    at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.process(HttpReceiverOverHTTP.java:119)
    at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.receive(HttpReceiverOverHTTP.java:69)
    at org.eclipse.jetty.client.http.HttpChannelOverHTTP.receive(HttpChannelOverHTTP.java:90)
    at org.eclipse.jetty.client.http.HttpConnectionOverHTTP.onFillable(HttpConnectionOverHTTP.java:115)
    ... 9 more

HttpClient.setResponseBufferSize(int) http://download.eclipse.org/jetty/9.3.10.v20160621/apidocs/org/eclipse/jetty/client/HttpClient.html#setResponseBufferSize-int-用于配置用于从网络读取各个缓冲区的内部缓冲区大小。

它与您的响应正文内容大小无关。

您正在处理的情况是简单化的HttpClient.GET(uri) http://download.eclipse.org/jetty/9.3.10.v20160621/apidocs/org/eclipse/jetty/client/HttpClient.html#GET-java.net.URI-调用会将响应缓冲到FutureResponseListener http://download.eclipse.org/jetty/9.3.10.v20160621/apidocs/org/eclipse/jetty/client/util/FutureResponseListener.html内存使用限制为 2MB。

这个限制只是java的副作用Future概念。

这是一种用于小型响应的速记/便捷方法。

您有一个较大的响应,因此您需要使用 HttpClient 的异步功能从 HttpClient 管理的响应内容缓冲区/流中读取数据,根据您的需要处理数据。

Example:

    // In Initialization Code, start the client
    HttpClient client = new HttpClient();
    client.start();

    // In code much later on, use the client
    // Don't constantly start/stop the HttpClient
    // Treat the HttpClient as a browser, and each newRequest() as
    //   a tab on that browser.
    InputStreamResponseListener listener = new InputStreamResponseListener();
    // Send asynchronously with the InputStreamResponseListener
    client.newRequest(uri).send(listener);

    // Call to the listener's get() blocks until the headers arrived
    Response response = listener.get(5, TimeUnit.SECONDS);

    // Now check the response information that arrived to decide whether to read the content
    if (response.getStatus() == 200)
    {
        byte[] buffer = new byte[256];
        try (InputStream input = listener.getInputStream())
        {
            while (true)
            {
                int read = input.read(buffer);
                if (read < 0)
                    break;
                // Do something with the bytes just read
            }
        }
    }
    else
    {
        response.abort(new Exception());
    }

查看 HttpClientUsage.java https://github.com/eclipse/jetty.project/blob/jetty-9.3.10.v20160621/jetty-client/src/test/java/org/eclipse/jetty/client/api/Usage.java#L233-L265更多示例

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jetty 的 httpClient.setResponseBufferSize() 方法有什么作用吗? 的相关文章

随机推荐

  • Zeromq:如何在 C++ 中访问 tcp 消息

    我是 ZeroMQ 的新手 正在学习 echo 客户端 服务器模式 请求 回复 的 C hello world 示例 服务器看起来像 Hello World server in C Binds REP socket to tcp 5555
  • 核心数据性能:NSPredicate 比较对象

    If my Author NSManagedObject模型有一个authorID属性 由服务器确定 将NSFetchRequest表现更好 如果NSPredicate过滤依据authorID而不是完整的Author目的 假设我正在获取所有
  • Web.config 中的程序集

    我从事 NET开发大约有一年了 但我仍然不知道这样做的目的是什么
  • Flutter 中是否可以监听系统语言的变化?

    当用户更改系统语言时是否可以收听 当用户更改语言时 我需要清除一些列表 现在我正在检测中的语言void main 启动时运行 void main async Firebase Push Notifications initializatio
  • 如何处理 HTTP 响应中的多个 Set-Cookie 标头

    我正在尝试出于某种目的编写简单的代理服务器 在其中我使用 httplib 来访问远程 Web 服务器 但有一个问题 Web 服务器在一个响应中返回两个 Set Cookie 标头 而 httplib 在 httplib HTTPRespon
  • 更改 UINavigationBar 高度

    有人可以告诉我如何更改导航栏高度吗 这是我到目前为止所拥有的 CGFloat navBarHeight 10 self navigationController navigationBar frame size width navBarHe
  • 使用 EGit 进行合并会导致提交合并所做的所有更改

    我正在使用带有 EGit 的 Eclipse 并且我的 origin master 位于 github 上 这个项目有 3 名程序员工作 当我将更改拉到本地 git 使用 EGit 并且存在冲突时 我会解决它们 没有问题 问题是 当我提交时
  • 按值而非引用将对象属性复制到映射

    我不确定哪里出了问题 但似乎我无法从对象实例复制属性并将它们分配给映射 而在保存实例后不更改值 这是一个示例类 class Product String productName String proudctDescription int q
  • Django 中相同表单的两个不同的提交按钮

    我在 Django 中有一个 UpdateView 我只有一个普通的提交按钮 当对象正确更新时 它会通过以下方式重定向到对象列表success url 我可以制作两个不同的提交按钮 一个提交并重定向到对象列表页面 ListView 的按钮
  • 在 django 中通过一个查询获取多行?

    如何构建一个从 django 获取多行的 QuerySet 我认为 filter 会起作用 但它似乎更糟 例如 我在模型 Car 中有两行 具有两个文本属性 许可证和 vin 现在假设我想打印这些汽车的执照和车辆证明 我怎样才能通过一次数据
  • 使用 JavaFX 制作 Eclipse 插件? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我计划为 Eclipse 开发一组丰富的插件 其中涉及 Eclipse 内的 3D 图形渲染 JavaFX 是开发 Eclipse 插件的良好技
  • 如何在基于类的视图中返回 JSON 响应,而不是 HTTP 响应

    我有一个基于阶级的观点 我在引导模式上使用 Ajax 为了避免页面刷新 我想使用基于类的视图返回 JSON 响应而不是 HTTP 响应 但我只看到了如何为基于函数的视图返回 JSON 响应 视图 py from django contrib
  • 努力将 Objective C 选择器和目标签名转换为 Swift

    再会 我正在尝试将 Objective C 代码片段转换为 Swift 我知道选择器可以通过将其放入字符串中来直接翻译 但我无法理解 Objective C 签名 Objective C 选择器 第二个参数 UIImageWriteToSa
  • React Native FAILURE:构建失败并出现异常。无法解析“:classpath”。找不到 com.android.tools.build:gradle:3.0.1

    当我发出命令 react native run android 时 它发生了 失败 构建失败并出现异常 What went wrong A problem occurred configuring root project AsomePro
  • 同时写入同一个文件

    好的 我知道这个网站上有关于这个问题的类似问题 但是这些问题和提供的答案都不是我所需要的 我正在构建基于平面文件的 CMS 例如 如果 2 3 10 追加模式下的fwrite请求同时到达同一个php文件 contact form messa
  • 将变量声明为无符号的重要性

    如果您知道变量永远不应该为负数 那么将变量声明为无符号是否重要 它是否有助于防止除负数之外的任何内容被输入到不应该包含负数的函数中 将语义上非负值的变量声明为unsigned是一种良好的风格和良好的编程实践 但是 请记住 这并不能阻止您犯错
  • PHP 解析 .dat 文件

    我有一个 dat 文件 本质上是 分隔文件 我正在尝试将其转换为制表符分隔的 txt 我不确定的问题是新文件的每一行将是原始文件的 3 行的组合 每个原始行都有不同数量的数据 第一列仅标识分组中的每一行 最好的方法是什么 原始数据样本 01
  • python:如何在服务器端检测客户端断开连接?

    我正在用 python 进行套接字编程 我想在服务器端检测客户端套接字断开连接 Client socket connect host port try send something to server and get response fr
  • pandas 统计每个日期过去 7 天的值

    有两个数据框 首先是这样的 print df1 id date month is buy 0 17 2015 01 16 2015 01 1 1 17 2015 01 26 2015 01 1 2 17 2015 01 27 2015 01
  • Jetty 的 httpClient.setResponseBufferSize() 方法有什么作用吗?

    我正在使用 Jetty 的 HttpClient 构建一个简单的代理服务器 我在 Java 1 8 0 45 上使用 Jetty 版本 9 3 10 v20160621 我遇到过这样的情况 我对资源执行 GET 操作 该资源将返回大小约为