package org.xbib.pipeline;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
/**
* Basic pipeline for pipeline requests.
* This abstract class can be used for creating custom Pipeline classes.
*
* @param <R> the pipeline request type
*/
public abstract class AbstractPipeline<R extends PipelineRequest>
implements Pipeline<R> {
private final static Logger logger = LogManager.getLogger(AbstractPipeline.class);
private BlockingQueue<R> queue; //= new SynchronousQueue<>(true);
@Override
public Pipeline<R> setQueue(BlockingQueue<R> queue) {
if (queue == null) {
throw new IllegalArgumentException();
}
this.queue = queue;
return this;
}
public BlockingQueue<R> getQueue() {
return queue;
}
/**
* Call this thread. Take next request and pass them to request listeners.
* At least, this pipeline itself can listen to requests and handle errors.
* Only PipelineExceptions are handled for each listener. Other execptions will quit the
* pipeline request executions.
* @return a metric about the pipeline request executions.
* @throws Exception if pipeline execution was sborted by a non-PipelineException
*/
@Override
public R call() throws Exception {
R r = null;
try {
r = queue.poll(5L, TimeUnit.SECONDS);
while (r != null) {
newRequest(this, r);
r = queue.poll(5L, TimeUnit.SECONDS);
}
close();
} catch (InterruptedException e) {
logger.warn("interrupted");
} catch (Throwable t) {
logger.error(t.getMessage(), t);
throw t;
}
return r;
}
/**
* A new request for the pipeline is processed.
* @param pipeline the pipeline
* @param request the pipeline request
*/
public abstract void newRequest(Pipeline<R> pipeline, R request);
}