httpasyncclient初体验

  |   0 评论   |   0 浏览

背景

httpasyncclient使用了nio进行封装。所有请求可以塞入缓存区,不阻塞当前线程。
同时,通过回调机制,产生类似于aio的效果。

体验

pom文件

http异步客户端

<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpasyncclient</artifactId>
	<version>4.1.4</version>
</dependency>

代码


import java.io.IOException;
import java.util.concurrent.TimeUnit;

import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.concurrent.FutureCallback;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.impl.nio.client.HttpAsyncClients;
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.util.EntityUtils;

public class MainTest222 {

	public static void main(String[] args) throws Exception {
		// 配置io线程
		IOReactorConfig ioReactorConfig = IOReactorConfig.custom()
				.setIoThreadCount(Runtime.getRuntime().availableProcessors()).setSoKeepAlive(true).build();

		// 设置连接池大小
		ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(ioReactorConfig);
		PoolingNHttpClientConnectionManager connManager = new PoolingNHttpClientConnectionManager(ioReactor);
		connManager.setMaxTotal(100);
		connManager.setDefaultMaxPerRoute(100);

		RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30000).setSocketTimeout(30000)
				.setConnectionRequestTimeout(1000).build();
		final CloseableHttpAsyncClient client = HttpAsyncClients.custom().setConnectionManager(connManager)
				.setDefaultRequestConfig(requestConfig).build();

		// 构造请求
		String url = "https://note.abeffect.com/";
		HttpGet httpGet = new HttpGet(url);

		// start
		client.start();

		// 异步请求
		client.execute(httpGet, new CallBack());
		System.out.println("run 1");

		client.execute(httpGet, new CallBack());
		System.out.println("run 2");

		client.execute(httpGet, new CallBack());
		System.out.println("run 3");

		client.execute(httpGet, new CallBack());
		System.out.println("run 4");

		client.execute(httpGet, new CallBack());
		System.out.println("run 5");

		System.out.println("sleep 60s then exit. ");
		TimeUnit.SECONDS.sleep(60);
	}

	private static class CallBack implements FutureCallback<HttpResponse> {

		private long start = System.currentTimeMillis();

		@Override
		public void completed(HttpResponse httpResponse) {
			try {
				System.out.println("cost " + (System.currentTimeMillis() - start) + " ms, length = "
						+ EntityUtils.toString(httpResponse.getEntity()).length());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		@Override
		public void failed(Exception e) {
			System.err.println(" cost " + (System.currentTimeMillis() - start) + " ms, " + e);
		}

		@Override
		public void cancelled() {
		}
	}
}

运行效果

run 1
run 2
run 3
run 4
run 5
sleep 60s then exit. 
cost 3073 ms, length = 60497
cost 3077 ms, length = 60497
cost 3079 ms, length = 60497
cost 3244 ms, length = 60497
cost 3330 ms, length = 60497

参考