public class HttpClientServiceImpl implements HttpClientService {
private HttpClient client;
private ExecutorService pool;
public HttpClientServiceImpl() {
client = new HttpClient(new MultiThreadedHttpConnectionManager());
pool = Executors.newFixedThreadPool(10);
((ThreadPoolExecutor)pool).prestartAllCoreThreads();
}
@Override
public void doGets(HttpClientServiceObserver observer, String[] paths, HttpResponse response)
throws Exception {
Long start = System.currentTimeMillis();
List<Future<Void>> futures = new ArrayList<Future<Void>>(10);
for(String path : paths)
futures.add(pool.submit(new GetThread(client, observer, path, response)));
for(Future<Void> future : futures)
future.get();
}
@Override
public void setHost(URI host) {
client.getHostConfiguration().setHost(host.getHost(), host.getPort(), host.getScheme());
}
private static class GetThread implements Callable<Void> {
private HttpClient client;
HttpClientServiceObserver observer;
HttpResponse response;
String path;
public GetThread(HttpClient client, HttpClientServiceObserver observer, String path, HttpResponse response) {
this.client = client;
this.observer = observer;
this.path = path;
this.response = response;
}
@Override
public Void call() throws Exception {
Long start = System.currentTimeMillis();
GetMethod method = new GetMethod(this.path);
this.client.executeMethod(method);
observer.processResponse(response, method.getResponseBodyAsStream());
method.releaseConnection();
Logger.getAnonymousLogger().info("Thread:" + (System.currentTimeMillis() - start));
return null;
}
}
}