我想用一个连接管理器创建多个HttpAsyncClient(类似于the example in the Baeldung article).

问题是,这似乎不适用于HttpAsyncClient(只适用于HttpClient).应用程序失败,并在日志(log)中显示以下错误:

14:00:56.443 [pool-2-thread-1] ERROR org.apache.http.impl.nio.client.InternalHttpAsyncClient - I/O reactor terminated abnormally
java.lang.IllegalStateException: Illegal state ACTIVE
    at org.apache.http.util.Asserts.check(Asserts.java:46)
    at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor.execute(AbstractMultiworkerIOReactor.java:316)
    at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.execute(PoolingNHttpClientConnectionManager.java:221)
    at org.apache.http.impl.nio.client.CloseableHttpAsyncClientBase$1.run(CloseableHttpAsyncClientBase.java:64)
    at java.base/java.lang.Thread.run(Thread.java:833)

Exception in thread "main" java.util.concurrent.ExecutionException: java.util.concurrent.CancellationException: Request execution cancelled
    at org.apache.http.concurrent.BasicFuture.getResult(BasicFuture.java:71)
    at org.apache.http.concurrent.BasicFuture.get(BasicFuture.java:84)
    at org.apache.http.impl.nio.client.FutureWrapper.get(FutureWrapper.java:70)
    at com.example.Test.main(Test.java:32)
Caused by: java.util.concurrent.CancellationException: Request execution cancelled
    at org.apache.http.impl.nio.client.CloseableHttpAsyncClientBase.execute(CloseableHttpAsyncClientBase.java:114)
    at org.apache.http.impl.nio.client.InternalHttpAsyncClient.execute(InternalHttpAsyncClient.java:138)
    at org.apache.http.impl.nio.client.CloseableHttpAsyncClient.execute(CloseableHttpAsyncClient.java:75)
    at org.apache.http.impl.nio.client.CloseableHttpAsyncClient.execute(CloseableHttpAsyncClient.java:108)
    at org.apache.http.impl.nio.client.CloseableHttpAsyncClient.execute(CloseableHttpAsyncClient.java:92)
    at com.example.Test.main(Test.java:31)

这是我正在运行的代码:

package com.example;

import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.LaxRedirectStrategy;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
import org.apache.http.impl.nio.reactor.IOReactorConfig;
import org.apache.http.nio.reactor.ConnectingIOReactor;
import org.apache.http.nio.reactor.IOReactorException;

import java.util.concurrent.ExecutionException;

public class Test {
    public static void main(String[] args) throws IOReactorException, ExecutionException, InterruptedException {
        ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(IOReactorConfig.custom().build());
        PoolingNHttpClientConnectionManager connManager = new PoolingNHttpClientConnectionManager(ioReactor);
        CloseableHttpAsyncClient client1 = HttpAsyncClientBuilder.create()
                .setConnectionManager(connManager)
                .setRedirectStrategy(new LaxRedirectStrategy())
                .build();
        client1.start();
        CloseableHttpAsyncClient client2 = HttpAsyncClientBuilder.create()
                .setConnectionManager(connManager)
                .build();
        client2.start();

        var res1 = client1.execute(new HttpGet("https://www.google.com"), null);
        res1.get();
        var res2 = client2.execute(new HttpGet("https://www.google.com"), null);
        res2.get();
    }
}

我使用的是版本4.4.15的https://hc.apache.org/

推荐答案

告诉两个构建器连接管理器是共享的:

CloseableHttpAsyncClient client1 = HttpAsyncClientBuilder.create()
        .setConnectionManager(connManager)
        .setRedirectStrategy(new LaxRedirectStrategy())
        .build();
client1.start();
CloseableHttpAsyncClient client2 = HttpAsyncClientBuilder.create()
        .setConnectionManager(connManager)
        // do not call setConnectionManagerShared on the first client, only on all others sharing the same connManager
        .setConnectionManagerShared(true) 
        .build();
client2.start();

Java相关问答推荐

我可以从Java模块中排除maven资源文件夹吗?

最小拓Flutter 排序的时间复杂度是多少?

确定Java中Math.Ranb()输出的上限

Java Swing:初始化身份验证类后未检测到ATM_Interface键事件

当Volatile关键字真的是必要的时候?

JDK 21-为什么线程局部随机S nextInt不直接用Super.nextInt实现?

未找到适用于响应类型[类java.io.InputStream]和内容类型[Text/CSV]的HttpMessageConverter

如何在antlr4中跳过所有反斜杠-换行符而保留换行符?

在处理2个映射表时,没有更多的数据可从套接字读取

从LineChart<;字符串、字符串和gt;中删除数据时出现特殊的ClassCastException;

如何在不作为类出现的表上执行原生查询?

如何使用WebEnvironment.RANDOM_PORT获得第二个随机端口?

使用MediaPlayer类在一段时间后停止播放音乐

用于Java的Visual Studio代码完成不起作用

Java List有一个在一个位置添加多个元素的方法,但我找不到一个在一个位置删除多个元素的方法

Bash数组的单引号元素并使用空格连接

";home/runner/work/中没有文件...匹配到[**/pom.xml];Maven项目的构建过程中出现错误

JOOQ:批处理CRUD操作使用动态表定义,如何?

spring 数据Elastic search 与 spring 启动数据Elastic search 之间的区别是什么?

Spring Boot Security-每个端点都被403禁止,Spring记录一个BasicErrorController#错误(HttpServlet请求)