package com.constellio.app.modules.es.services.crawler;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.constellio.app.modules.es.connectors.spi.ConnectorJob;
public class MultithreadConnectorJobCrawler implements ConnectorJobCrawler {
private final BlockingQueue<Runnable> queue;
private final ThreadPoolExecutor executor;
public MultithreadConnectorJobCrawler() {
queue = new LinkedBlockingQueue<>();
int cores = Runtime.getRuntime().availableProcessors();
executor = new ThreadPoolExecutor(cores, cores * 2, 10, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.CallerRunsPolicy());
}
/* (non-Javadoc)
* @see connector.manager.ConnectorManager#crawl(java.util.List)
*/
public <V> void crawl(List<ConnectorJob> jobs)
throws InterruptedException {
Collection<Future<?>> futures = new LinkedList<Future<?>>();
for (ConnectorJob job : jobs) {
if (job != null) {
futures.add(executor.submit(job));
}
}
for (Future<?> future : futures) {
try {
future.get();
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
}
}
public void shutdown() {
executor.shutdown();
}
}