package com.breakersoft.plow.dispatcher.pipeline;
import java.util.Collection;
import java.util.UUID;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import org.slf4j.Logger;
import com.breakersoft.plow.JobId;
public class Pipeline implements JobId, Runnable {
private static final Logger logger =
org.slf4j.LoggerFactory.getLogger(Pipeline.class);
private final UUID jobId;
private final LinkedBlockingQueue<PipelineCommand> queue;
private final AtomicBoolean isRunning;
public Pipeline(UUID jobId) {
this.jobId = jobId;
this.queue = new LinkedBlockingQueue<PipelineCommand>();
this.isRunning = new AtomicBoolean(false);
}
public void add(PipelineCommand command) {
queue.add(command);
}
public void addAll(Collection<PipelineCommand> command) {
queue.addAll(command);
}
@Override
public UUID getJobId() {
return jobId;
}
@Override
public void run() {
if (queue.isEmpty()) {
return;
}
if (!isRunning.compareAndSet(false, true)){
return;
}
try {
while (true) {
PipelineCommand command = queue.poll();
if (command == null) {
return;
}
try {
command.process();
} catch (RuntimeException e) {
logger.warn("{} pipeline exception, unexpected exception: {}", jobId, e);
}
}
}
finally {
isRunning.set(false);
}
}
}