如何让HttpAsyncClient异步操作?

时间:2014-03-28 11:50:45

标签: java multithreading apache-httpclient-4.x

我正在尝试使用HttpAsyncClient来压力测试我的Web应用程序,方法是每秒提交一百或一千个HTTP请求并为每个请求计时。我的代码基于this quickstart guide,但似乎连接到服务器并发送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秒:

public class TestServlet extends HttpServlet {
    SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        getServletContext().log(
                "TestServlet Received POST at: " + fmt.format(new Date()));
        try {
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

}

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请求而不会产生大量线程?

1 个答案:

答案 0 :(得分:2)

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

尝试增加它们:

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