Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HttpAsyncClient每秒无法向特定路由(主机)发送多个请求_Java_Apache Httpcomponents_Apache Httpasyncclient - Fatal编程技术网

Java HttpAsyncClient每秒无法向特定路由(主机)发送多个请求

Java HttpAsyncClient每秒无法向特定路由(主机)发送多个请求,java,apache-httpcomponents,apache-httpasyncclient,Java,Apache Httpcomponents,Apache Httpasyncclient,为什么Apache HttpAsyncClient每秒只发送10个请求。我做错什么了吗?这是我启动异步客户端的方法: PoolingNHttpClientConnectionManager connManager = null; try { if (client != null && client.isRunning()) { client.close(); } TrustStrategy acce

为什么Apache HttpAsyncClient每秒只发送10个请求。我做错什么了吗?这是我启动异步客户端的方法:

PoolingNHttpClientConnectionManager connManager = null;
    try {
        if (client != null && client.isRunning()) {
            client.close();
        }

        TrustStrategy acceptingTrustStrategy = (certificate, authType) -> true;
        SSLContext sslContext = SSLContexts.custom()
                .loadTrustMaterial(null, acceptingTrustStrategy).build();
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,
                SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        Registry<ConnectionSocketFactory> socketFactoryRegistry =
                RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslsf).build();

        Registry<SchemeIOSessionStrategy> socketRegistry = RegistryBuilder.<SchemeIOSessionStrategy>create()
                .register("http", NoopIOSessionStrategy.INSTANCE)
                .register("https", new SSLIOSessionStrategy(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER))
                .build();

        connManager = new PoolingNHttpClientConnectionManager(
                new DefaultConnectingIOReactor( IOReactorConfig.custom()
                        .setConnectTimeout( connectionTimeout * 1000 ) //connectTimeout
                        .setSoTimeout( readTimeout * 1000 ) //readTimeout
                        .setIoThreadCount(10000)
                        .build() ), socketRegistry );
    } catch (Exception e) {}

    client = HttpAsyncClients.custom()
            .setMaxConnPerRoute( maxConnsPerRoute )
            .setConnectionManager( connManager )
            .setMaxConnTotal( maxConnections )
            .setKeepAliveStrategy( DefaultConnectionKeepAliveStrategy.INSTANCE )
            .build();

    client.start();
poolgnhttpclientconnectionmanager connManager=null;
试一试{
if(client!=null&&client.isRunning()){
client.close();
}
TrustStrategy acceptingTrustStrategy=(证书,authType)->true;
SSLContext SSLContext=SSLContexts.custom()
.loadTrustMaterial(null,acceptingTrustStrategy).build();
SSLConnectionSocketFactory sslsf=新的SSLConnectionSocketFactory(sslContext,
SSLConnectionSocketFactory。允许\u所有\u主机名\u验证程序);
注册表socketFactoryRegistry=
RegistryBuilder.create().register(“https”,sslsf.build();
注册表socketRegistry=RegistryBuilder.create()
.register(“http”,NoopIOSessionStrategy.INSTANCE)
.register(“https”,新的SSLIOSessionStrategy(sslContext,SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER))
.build();
connManager=新池gnhttpclientconnectionmanager(
新的DefaultConnectionReactor(IOReactorConfig.custom()
.setConnectTimeout(connectionTimeout*1000)//connectTimeout
.setSoTimeout(readTimeout*1000)//readTimeout
.setIoThreadCount(10000)
.build()),socketRegistry);
}捕获(例外e){}
client=HttpAsyncClients.custom()
.setMaxConnPerRoute(maxConnsPerRoute)
.setConnectionManager(连接管理器)
.SetMaxConntTotal(maxConnections)
.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
.build();
client.start();
而且,这是我使用它的方式:

for(int i = 0; i < 100; i++) {
     client.execute(request.getHttpPost(), null);
}
for(int i=0;i<100;i++){
execute(request.getHttpPost(),null);
}

如何实现每秒更多的请求???

所有版本的Apache HttpClient都可以轻松地每秒生成数以万计的请求

性能问题可能与服务器代码或应用程序代码有关

  • 不要这样做。这太糟糕了。使用的I/O调度线程不应超过系统上的CPU内核数。除非有非常充分的理由,否则不要覆盖默认值

    .setIoThreadCount(10000) // do not do this
    
  • 如果手动设置连接管理器,则所有连接管理参数均无效。代码中的
    maxConnsPerRoute
    maxConnections
    值均无效。您需要将它们直接应用于连接管理器

    .setConnectionManager( connManager ) // if you do this
    .setMaxConnPerRoute( maxConnsPerRoute ) // this has no effect
    .setMaxConnTotal( maxConnections )
    

  • 所有版本的ApacheHttpClient每秒都可以轻松生成上万个请求

    性能问题可能与服务器代码或应用程序代码有关

  • 不要这样做。这太糟糕了。使用的I/O调度线程不应超过系统上的CPU内核数。除非有非常充分的理由,否则不要覆盖默认值

    .setIoThreadCount(10000) // do not do this
    
  • 如果手动设置连接管理器,则所有连接管理参数均无效。代码中的
    maxConnsPerRoute
    maxConnections
    值均无效。您需要将它们直接应用于连接管理器

    .setConnectionManager( connManager ) // if you do this
    .setMaxConnPerRoute( maxConnsPerRoute ) // this has no effect
    .setMaxConnTotal( maxConnections )
    
  • 非常感谢,在他的指导下,我将这些代码添加到我的项目中,问题得以解决:

    connManager.setMaxTotal(10);
    connManager.setDefaultMaxPerRoute(10);
    HttpHost host = new HttpHost("75.10.91.11", 8443, "https");
    connManager.setMaxPerRoute(new HttpRoute(host), 10);
    
    您可以在

    中找到完整的解释,非常感谢,在他的指导下,我将这些代码添加到我的项目中,并解决了问题:

    connManager.setMaxTotal(10);
    connManager.setDefaultMaxPerRoute(10);
    HttpHost host = new HttpHost("75.10.91.11", 8443, "https");
    connManager.setMaxPerRoute(new HttpRoute(host), 10);
    

    您可以在

    中找到完整的解释,谢谢您的回复。只有一个问题:在主题“”中,他们说:根据RFC 2616规范,默认情况下,HttpAsyncClient只允许两个并发连接到同一主机。对吗?因为我将所有请求发送到同一个主机。这是正确的。默认情况下,HttpAsyncClient 4.1.x仅使用两个并发连接。如果您想增加这个数字,可以通过连接管理器实现的
    ConnPoolControl
    接口来实现。非常感谢您的帮助。根据你的建议,我可以根据具体路线发送更多请求,这就解决了我的问题。谢谢你的回复。只有一个问题:在主题“”中,他们说:根据RFC 2616规范,默认情况下,HttpAsyncClient只允许两个并发连接到同一主机。对吗?因为我将所有请求发送到同一个主机。这是正确的。默认情况下,HttpAsyncClient 4.1.x仅使用两个并发连接。如果您想增加这个数字,可以通过连接管理器实现的
    ConnPoolControl
    接口来实现。非常感谢您的帮助。根据你的建议,我可以根据具体路线发送更多请求,这就解决了我的问题。