package com.breakersoft.plow.dispatcher.pipeline;
import java.util.Collection;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
import com.breakersoft.plow.JobId;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
@Component
public class PipelineControllerImpl implements PipelineController {
@Autowired
@Qualifier("pipelineExecutor")
private ThreadPoolTaskExecutor pipelineExecutor;
private LoadingCache<UUID, Pipeline> pipelines;
public PipelineControllerImpl() {
pipelines = CacheBuilder.newBuilder()
.expireAfterAccess(1, TimeUnit.HOURS)
.concurrencyLevel(16)
.build(
new CacheLoader<UUID, Pipeline>() {
public Pipeline load(UUID key) {
return new Pipeline(key);
}
});
}
public void execute(PipelineCommand command) {
try {
Pipeline pipeline = pipelines.get(command.getJobId());
pipeline.add(command);
pipelineExecutor.execute(pipeline);
} catch (ExecutionException e) {
System.err.println("Unable to add execution pipeline: " + e);
}
}
public void execute(JobId id, Collection<PipelineCommand> commands) {
try {
Pipeline pipeline = pipelines.get(id.getJobId());
pipeline.addAll(commands);
pipelineExecutor.execute(pipeline);
} catch (ExecutionException e) {
System.err.println("Unable to add execution pipeline: " + e);
}
}
public void waitForShutdown() throws InterruptedException {
pipelineExecutor.getThreadPoolExecutor().shutdown();
pipelineExecutor.getThreadPoolExecutor().awaitTermination(10, TimeUnit.SECONDS);
}
}