Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading_Apache Httpclient 4.x - Fatal编程技术网

Java 如何让HttpAsyncClient异步运行?

Java 如何让HttpAsyncClient异步运行?,java,multithreading,apache-httpclient-4.x,Java,Multithreading,Apache Httpclient 4.x,我试图使用HttpAsyncClient对我的web应用程序进行压力测试,每秒提交100或1000个HTTP请求,并对每个请求的响应进行计时。我的代码是基于的,但是连接到服务器并发送HTTP请求的线程似乎坐在那里等待服务器的响应!相反,我希望它在不等待HTTP响应的情况下继续发送下一个HTTP请求 以下是我的测试代码: public class TestAsyncHttpRequest { private static final SimpleDateFormat FORMAT = n

我试图使用HttpAsyncClient对我的web应用程序进行压力测试,每秒提交100或1000个HTTP请求,并对每个请求的响应进行计时。我的代码是基于的,但是连接到服务器并发送HTTP请求的线程似乎坐在那里等待服务器的响应!相反,我希望它在不等待HTTP响应的情况下继续发送下一个HTTP请求

以下是我的测试代码:

public class TestAsyncHttpRequest {

    private static final SimpleDateFormat FORMAT = new SimpleDateFormat(
            "yyyy-MM-dd hh:mm:ss.SSS");

    public static void main(String[] args) throws Exception {

        CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
        try {
            // Start the client
            httpclient.start();
            final CountDownLatch latch = new CountDownLatch(100);
            for (int i = 0; i < 100; i++) {
                System.out.println("Sending POST request at "
                        + FORMAT.format(new Date()));
                final HttpPost request = new HttpPost(
                        "http://localhost:8080/test");
                httpclient.execute(request, new FutureCallback<HttpResponse>() {

                    public void completed(final HttpResponse response) {
                        latch.countDown();
                    }

                    public void failed(final Exception ex) {
                        latch.countDown();
                    }

                    public void cancelled() {
                        latch.countDown();
                    }

                });
                Thread.sleep(50);
            }
            latch.await();
        } finally {
            httpclient.close();
        }
    }
}
servlet输出如下—请注意,它每20秒只接收两个请求:

INFO: TestServlet Received POST at: 2014-03-28 07:01:16.838
INFO: TestServlet Received POST at: 2014-03-28 07:01:16.838
INFO: TestServlet Received POST at: 2014-03-28 07:01:36.873
INFO: TestServlet Received POST at: 2014-03-28 07:01:36.873
INFO: TestServlet Received POST at: 2014-03-28 07:01:56.881
INFO: TestServlet Received POST at: 2014-03-28 07:01:56.881
INFO: TestServlet Received POST at: 2014-03-28 07:02:16.891
INFO: TestServlet Received POST at: 2014-03-28 07:02:16.891

是否有一些配置选项允许我向服务器发送一千个HTTP请求而不产生大量线程?

HttpAsyncClient
对每个主机的并发连接总数和并发连接数有限制

试着增加它们:

CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
    .setMaxConnTotal(100)
    .setMaxConnPerRoute(100)
    .build();

哦,是的!看来,我的限制因素是每条路由的mac连接数,默认为2?!?!
CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
    .setMaxConnTotal(100)
    .setMaxConnPerRoute(100)
    .build();