package cz.cuni.mff.d3s.been.objectrepository;
import com.hazelcast.core.IQueue;
import cz.cuni.mff.d3s.been.cluster.Service;
import cz.cuni.mff.d3s.been.cluster.ServiceException;
import cz.cuni.mff.d3s.been.cluster.context.ClusterContext;
import cz.cuni.mff.d3s.been.persistence.SuccessAction;
/**
* A generic drain for a generic distributed queue.
*
* @author darklight
*
* @param <T> Type of items in the drained queue
*/
abstract class QueueDrain<T> implements Service {
private final Float failRateThreshold;
private final Long suspendTimeOnHighFailRate;
private final String queueName;
private final ClusterContext ctx;
private final SuccessAction<T> successAction;
private IQueue<T> queue;
private Digester<T> digester;
private ItemCounterListener<T> itemListener;
protected QueueDrain(ClusterContext ctx, String queueName, SuccessAction<T> successAction, Float failRateThreshold, Long suspendTimeOnHighFailRate) {
this.ctx = ctx;
this.queueName = queueName;
this.successAction = successAction;
this.failRateThreshold = failRateThreshold;
this.suspendTimeOnHighFailRate = suspendTimeOnHighFailRate;
}
@Override
public void start() throws ServiceException {
queue = ctx.getQueue(queueName);
digester = Digester.create(createTakeAction(), createPollAction(), successAction, createFailAction(), failRateThreshold, suspendTimeOnHighFailRate);
itemListener = ItemCounterListener.create(digester);
digester.start();
queue.addItemListener(itemListener, false);
}
@Override
public void stop() {
queue.removeItemListener(itemListener);
digester.stop();
}
protected Take<T> createTakeAction() {
return new QueueTake<T>(queue);
}
protected Poll<T> createPollAction() {
return new QueuePoll<T>(queue);
}
protected QueueFailAction<T> createFailAction() {
return new QueueFailAction<T>(queue);
}
}