package eu.choreos.vv.client;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import eu.choreos.vv.data.ReportData;
import eu.choreos.vv.loadgenerator.LoadGeneratorFactory;
public class MultiClient<T extends Client<A,B>, A, B> extends BaseClient<A,B> implements Callable<ReportData> {
protected List<T> clients;
protected Iterator<T> iterator;
int numberOfCalls;
long delay;
protected void createClients(Class<T> cls, long qtd) throws InstantiationException, IllegalAccessException {
clients = new ArrayList<T>();
for (int i = 0; i < qtd; i++)
clients.add(cls.newInstance());
}
@Override
public ReportData execute(int numberOfCalls, long delay, Map params) throws Exception {
final ExecutorService executorService = Executors.newFixedThreadPool(clients.size());
final List<Future<ReportData>> futureResults = new ArrayList<Future<ReportData>>();
ReportData report = new ReportData();
this.params = params;
this.numberOfCalls = numberOfCalls;
this.delay = delay;
this.setUp();
iterator = clients.iterator();
try {
while (iterator.hasNext()) {
futureResults.add(executorService.submit(this));
// report.merge(client.execute(numberOfCalls, delay, params));
}
executorService.shutdown();
while (!executorService.awaitTermination(LoadGeneratorFactory.getInstance().getTimeout(), TimeUnit.SECONDS))
;
} catch (InterruptedException e) {
executorService.shutdownNow();
throw e;
}
for (Future<ReportData> future : futureResults)
report.merge(future.get());
this.tearDown();
return report;
}
@Override
public ReportData call() throws Exception {
Client client = iterator.next();
return client.execute(numberOfCalls, delay, params);
}
}