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() 方法有什么作用吗? 的相关文章

  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • 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 操作 该资源将返回大小约为