org.apache.hc.core5.http2.impl.nio.AbstractH2StreamMultiplexer.onInput 中的 java.nio.BufferOverflowException

问题描述

使用此代码访问暴露的 HTTP/2 网址:

        H2Config h2Config = H2Config.custom().setPushEnabled(false)
            .setCompressionEnabled(true) // Make it a prop
            .setHeaderTableSize(INIT_HEADER_TABLE_SIZE)
            .setMaxConcurrentStreams(Integer.MAX_VALUE) // no limit
            .setMaxFrameSize(INIT_MAX_FRAME_SIZE)
            .setinitialWindowSize(INIT_WINDOW_SIZE)
            .setMaxHeaderListSize(Integer.MAX_VALUE)
            .build(); // unlimited
    CloseableHttpAsyncclient asyncclient = HttpAsyncclients.customHttp2()
        .setTlsstrategy(ClientTlsstrategyBuilder.create()
                .setSslContext(SSLContexts.createSystemDefault())
                .setTlsversions(TLS.V_1_2)
                .build())
        .setH2Config(h2Config)
        .setIOReactorConfig(IOReactorConfig.custom()
                .setSoTimeout(Timeout.ofSeconds(5))
                .build())
        .setDefaultRequestConfig(org.apache.hc.client5.http.config.RequestConfig.custom()
                .setConnectTimeout(Timeout.ofSeconds(5))
                .setResponseTimeout(Timeout.ofSeconds(5))
                .setCookieSpec(StandardCookieSpec.STRICT)
                .build())
        .build();
    
    org.apache.hc.core5.http.HttpRequest httpGet = new BasicHttpRequest(Method.GET,new URL("XXXX").toURI());       
    BasicAsyncEntityConsumer entityConsumer = new BasicAsyncEntityConsumer();
    CompletableFuture<byte[]> result = new CompletableFuture<>();
    FutureCallback<Message<HttpResponse,byte[]>> callback = new Callback2<byte[]>(result,"Test");
    BasicRequestProducer basicRequestProducer = new BasicRequestProducer(httpGet,null);
    asyncclient.execute(basicRequestProducer,new BasicResponseConsumer<>(entityConsumer),null,callback);

回调 2:

public class Callback2<T> implements FutureCallback<Message<HttpResponse,T>> {

private String message;
protected CompletableFuture<T> result;

public Callback(CompletableFuture<T> result,String message) {
    this.result = result;
    this.message = message;
}

@Override
public void cancelled() {
    result.cancel(true);
}

@Override
public void completed(Message<HttpResponse,T> arg0) {
    HttpResponse response = arg0.getHead();
    System.out.println(String.format(message + " completed : http response %s",response));
    result.complete(arg0.getBody());
}

@Override
public void Failed(Exception arg0) {
    result.completeExceptionally(arg0);
}

}

它失败了,我有这个我不明白的堆栈跟踪:

java.nio.BufferOverflowException
at java.base/java.nio.HeapByteBuffer.put(HeapByteBuffer.java:233)
at org.apache.hc.core5.http2.impl.nio.FrameInputBuffer.put(FrameInputBuffer.java:89)
at org.apache.hc.core5.http2.impl.nio.AbstractH2StreamMultiplexer.onInput(AbstractH2StreamMultiplexer.java:437)
at org.apache.hc.core5.http2.impl.nio.AbstractH2IOEventHandler.inputReady(AbstractH2IOEventHandler.java:65)
at org.apache.hc.core5.http2.impl.nio.ClientH2IOEventHandler.inputReady(ClientH2IOEventHandler.java:39)
at org.apache.hc.core5.reactor.ssl.SSLIOSession.decryptData(SSLIOSession.java:553)
at org.apache.hc.core5.reactor.ssl.SSLIOSession.access$400(SSLIOSession.java:72)
at org.apache.hc.core5.reactor.ssl.SSLIOSession$1.inputReady(SSLIOSession.java:172)
at org.apache.hc.core5.reactor.InternalDataChannel.onIOEvent(InternalDataChannel.java:131)
at org.apache.hc.core5.reactor.InternalChannel.handleIOEvent(InternalChannel.java:51)
at org.apache.hc.core5.reactor.SingleCoreIOReactor.processEvents(SingleCoreIOReactor.java:178)
at org.apache.hc.core5.reactor.SingleCoreIOReactor.doExecute(SingleCoreIOReactor.java:127)
at org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.execute(AbstractSingleCoreIOReactor.java:85)
at org.apache.hc.core5.reactor.IOReactorWorker.run(IOReactorWorker.java:44)
at java.base/java.lang.Thread.run(Thread.java:834)

如果我添加日志(只添加 log4j2.xml),我会得到一个不同的异常:

        2021-03-01 22:02:16,505 DEBUG [org.apache.hc.client5.http.impl.async.InternalAbstractHttpAsyncclient] ex-00000003: preparing request execution
    2021-03-01 22:02:16,505 DEBUG [org.apache.hc.client5.http.protocol.RequestAddCookies] Cookie spec selected: strict
    2021-03-01 22:02:16,505 DEBUG [org.apache.hc.client5.http.protocol.RequestAuthCache] Auth cache not set in the context
    2021-03-01 22:02:16,506 DEBUG [org.apache.hc.client5.http.impl.async.AsyncProtocolExec] ex-00000003: target auth state: UNCHALLENGED
    2021-03-01 22:02:16,506 DEBUG [org.apache.hc.client5.http.impl.async.AsyncProtocolExec] ex-00000003: proxy auth state: UNCHALLENGED
    2021-03-01 22:02:16,506 DEBUG [org.apache.hc.client5.http.impl.async.AsyncConnectExec] ex-00000003: acquiring connection with route {s}->https://www.example.com:443
    2021-03-01 22:02:16,506 DEBUG [org.apache.hc.client5.http.impl.async.InternalH2Asyncclient] ex-00000003: acquiring endpoint (5 SECONDS)
    2021-03-01 22:02:16,506 DEBUG [org.apache.hc.client5.http.impl.nio.MultihomeIOSessionRequester] https://www.example.com:443: resolving remote address
    2021-03-01 22:02:16,506 DEBUG [org.apache.hc.client5.http.impl.nio.MultihomeIOSessionRequester] https://www.example.com:443: resolved to [www.example.com/2.23.92.197,www.example.com/2.23.92.194,www.example.com/2a02:26f0:2f00:0:0:0:17d5:630,www.example.com/2a02:26f0:2f00:0:0:0:17d5:649]
    2021-03-01 22:02:16,506 DEBUG [org.apache.hc.client5.http.impl.nio.MultihomeIOSessionRequester] https://www.example.com:443: connecting null to www.example.com/2.23.92.197:443 (5 SECONDS)
    2021-03-01 22:02:16,513 DEBUG [org.apache.hc.client5.http.impl.nio.MultihomeIOSessionRequester] https://www.example.com:443: connected c-0000000002 /192.168.0.33:36526->www.example.com/2.23.92.197:443
    2021-03-01 22:02:16,514 DEBUG [org.apache.hc.client5.http.impl.async.InternalH2Asyncclient] ex-00000003: acquired endpoint
    2021-03-01 22:02:16,514 DEBUG [org.apache.hc.client5.http.impl.async.H2AsyncMainClientExec] ex-00000003: executing GET /xxx/test.txt HTTP/1.1
    2021-03-01 22:02:16,514 DEBUG [org.apache.hc.client5.http.impl.async.InternalH2Asyncclient] c-0000000002: start execution ex-00000003
    2021-03-01 22:02:16,514 DEBUG [org.apache.hc.client5.http.ssl.AbstractClientTlsstrategy] Enabled protocols: [TLSv1.2]
    2021-03-01 22:02:16,515 DEBUG [org.apache.hc.client5.http.ssl.AbstractClientTlsstrategy] Enabled cipher suites:[TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_DSS_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
    2021-03-01 22:02:16,538 DEBUG [org.apache.hc.client5.http.ssl.AbstractClientTlsstrategy] Secure session established
    2021-03-01 22:02:16,538 DEBUG [org.apache.hc.client5.http.ssl.AbstractClientTlsstrategy]  negotiated protocol: TLSv1.2
    2021-03-01 22:02:16,538 DEBUG [org.apache.hc.client5.http.ssl.AbstractClientTlsstrategy]  negotiated cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
    2021-03-01 22:02:16,538 DEBUG [org.apache.hc.client5.http.ssl.AbstractClientTlsstrategy]  peer principal: CN=xxxx.e.example.net,O="Foo,Inc.",L=CA,ST=MA,C=US
    2021-03-01 22:02:16,538 DEBUG [org.apache.hc.client5.http.ssl.AbstractClientTlsstrategy]  peer alternative names: [a248.e.example.net,*.example.net,*.example-staging.net,*.example-staging.net]
    2021-03-01 22:02:16,538 DEBUG [org.apache.hc.client5.http.ssl.AbstractClientTlsstrategy]  issuer principal: CN=DigiCert Secure Site ECC CA-1,OU=www.example.com,O=DigiCert Inc,539 DEBUG [org.apache.hc.client5.http.wire] c-0000000002 >> "PRI * HTTP/2.0[\r][\n]"
    2021-03-01 22:02:16,539 DEBUG [org.apache.hc.client5.http.wire] c-0000000002 >> "[\r][\n]"
    2021-03-01 22:02:16,539 DEBUG [org.apache.hc.client5.http.wire] c-0000000002 >> "SM[\r][\n]"
    2021-03-01 22:02:16,540 DEBUG [org.apache.hc.client5.http.wire] c-0000000002 >> "[0x0][0x0]$[0x4][0x0][0x0][0x0][0x0][0x0][0x0][0x1][0x0][0x0][0x10][0x0][0x0][0x2][0x0][0x0][0x0][0x0][0x0][0x3][0x7f][0xffffffff][0xffffffff][0xffffffff][0x0][0x4][0x0][0x0][0xffffffff][0xffffffff][0x0][0x5][0x0][0x0]@[0x0][0x0][0x6][0x7f][0xffffffff][0xffffffff][0xffffffff]"
    2021-03-01 22:02:16,540 DEBUG [org.apache.hc.client5.http.wire] c-0000000002 >> "[0x0][0x0][0x4][0x8][0x0][0x0][0x0][0x0][0x0][0x7f][0xffffffff][0x0][0x0]"
    2021-03-01 22:02:16,546 DEBUG [org.apache.hc.client5.http.impl.async.H2AsyncMainClientExec] ex-00000003: execution Failed: Connection is closed
    2021-03-01 22:02:16,546 DEBUG [org.apache.hc.client5.http.impl.async.InternalAbstractHttpAsyncclient] ex-00000003: request Failed: Connection is closed
    2021-03-01 22:02:16,546 DEBUG [org.apache.hc.client5.http.impl.async.InternalH2Asyncclient] c-0000000002: endpoint closed
    XXX Failed
    org.apache.hc.core5.http.ConnectionClosedException: Connection is closed
        at org.apache.hc.core5.http2.impl.nio.AbstractH2StreamMultiplexer.onException(AbstractH2StreamMultiplexer.java:661)
        at org.apache.hc.core5.http2.impl.nio.AbstractH2IOEventHandler.exception(AbstractH2IOEventHandler.java:91)
        at org.apache.hc.core5.http2.impl.nio.ClientH2IOEventHandler.exception(ClientH2IOEventHandler.java:39)
        at org.apache.hc.core5.reactor.ssl.SSLIOSession$1.exception(SSLIOSession.java:204)
        at org.apache.hc.core5.reactor.InternalDataChannel.onException(InternalDataChannel.java:169)
        at org.apache.hc.core5.reactor.InternalChannel.handleIOEvent(InternalChannel.java:55)
        at org.apache.hc.core5.reactor.SingleCoreIOReactor.processEvents(SingleCoreIOReactor.java:178)
        at org.apache.hc.core5.reactor.SingleCoreIOReactor.doExecute(SingleCoreIOReactor.java:127)
        at org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.execute(AbstractSingleCoreIOReactor.java:85)
        at org.apache.hc.core5.reactor.IOReactorWorker.run(IOReactorWorker.java:44)
        at java.base/java.lang.Thread.run(Thread.java:834)

所以:

  1. 为什么只添加日志会改变事情,我想这与速度有关
  2. 一个异常是什么意思?
  3. 我该如何解决

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...