package fi.iki.mkuokkanen.seda.queue;
import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.dsl.Disruptor;
import fi.iki.mkuokkanen.seda.queue.event.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.Executors;
import static com.google.common.base.Preconditions.checkState;
/**
* Abstract root class for queues.
*
* @author mkuokkanen
*/
abstract class AbstractDisruptor implements Queue {
private static Logger logger = LoggerFactory.getLogger(AbstractDisruptor.class);
private Disruptor<Message> disruptor;
private RingBuffer<Message> ringBuffer;
/**
* Create disruptor, a wizard for creating actual Ringbuffer.
*
* @return standard disruptor wizard
*/
protected Disruptor<Message> createDisruptorWizard() {
return new Disruptor<>(
Message.FACTORY,
128,
Executors.newCachedThreadPool());
}
protected RingBuffer<Message> getRingBuffer() {
checkState(ringBuffer != null, "Trying to fetch RingBuffer without starting disruptor.");
return ringBuffer;
}
@Override
public void start() {
logger.info("start() - disruptor queue");
disruptor = createDisruptorWizard();
setupEventHandlers(disruptor);
ringBuffer = disruptor.start();
}
@Override
public void stop() {
logger.info("stop() - disruptor queue");
disruptor.shutdown();
}
/**
* Configure Disruptor Wizard before creating.
*
* @param disruptor
*/
abstract void setupEventHandlers(Disruptor<Message> disruptor);
}