Jetty的httpClient.setResponseBufferSize()方法有什么作用吗? [英] Does Jetty's httpClient.setResponseBufferSize() method do anything?

查看:144
本文介绍了Jetty的httpClient.setResponseBufferSize()方法有什么作用吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

解决方案

//在初始化代码中,启动客户端HttpClient客户端=新的HttpClient();client.start();//在以后的代码中,使用客户端//不要持续启动/停止HttpClient//将HttpClient视为浏览器,并将每个newRequest()视为//该浏览器上的标签.InputStreamResponseListener监听器=新的InputStreamResponseListener();//使用InputStreamResponseListener异步发送client.newRequest(uri).send(listener);//调用侦听器的get()块,直到标题到达响应响应= listener.get(5,TimeUnit.SECONDS);//现在检查到达的响应信息,以决定是否读取内容如果(response.getStatus()== 200){byte []缓冲区=新的byte [256];尝试(InputStream input = listener.getInputStream()){一会儿(true){int read = input.read(buffer);如果(读取< 0)休息;//对刚刚读取的字节进行处理}}}别的{response.abort(new Exception());}

检出HttpClient 解决方案

HttpClient.setResponseBufferSize(int) is for configuring the internal buffer size used to read individual buffers from the network.

It has no relationship to your Response body content size.

The situation you are dealing with is that the simplistic HttpClient.GET(uri) call will buffer up the response into a FutureResponseListener which is limited to 2MB of memory usage.

This limit is merely a side effect of the java Future concepts.

This is a shorthand / convenience method meant for small responses.

You have a response that is larger, so its on you to use the asynchronous features of HttpClient to read from the response content buffers/streams that HttpClient is managing, processing the data according to what you need it to do.

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());
    }

Check out the HttpClient Usage.java for more examples

这篇关于Jetty的httpClient.setResponseBufferSize()方法有什么作用吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆