package org.juxtapose.streamline.producer.executor;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import com.lmax.disruptor.BusySpinWaitStrategy;
import com.lmax.disruptor.EventHandler;
import com.lmax.disruptor.MultiThreadedClaimStrategy;
import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.WaitStrategy;
import com.lmax.disruptor.YieldingWaitStrategy;
import com.lmax.disruptor.dsl.Disruptor;
/**
* @author Pontus
*
*/
public class StickyHashRingBuffer
{
static int RING_SIZE = 32768;
public final RingBuffer<RunnableEvent> ringBuffer;
/**
* @param inEventHandlers
*/
public StickyHashRingBuffer( int inEventHandlers, Executor inExecutor, boolean inTurboBoost )
{
WaitStrategy waitStrategy = inTurboBoost ? new BusySpinWaitStrategy() : new YieldingWaitStrategy();
Disruptor<RunnableEvent> disruptor = new Disruptor<RunnableEvent>(RunnableEvent.EVENT_FACTORY, new ScheduledThreadPoolExecutor( inEventHandlers ), new MultiThreadedClaimStrategy( RING_SIZE ), waitStrategy);
EventHandler<RunnableEvent>[] eventHandlers = new RunnableEventHandler[inEventHandlers];
for( int i = 0; i < inEventHandlers; i++ )
{
eventHandlers[i] = new RunnableEventHandler(i, inEventHandlers );
}
disruptor.handleEventsWith( eventHandlers );
ringBuffer = disruptor.start();
}
public void execute( IExecutable inRunnable )
{
long sequence = ringBuffer.next();
RunnableEvent event = ringBuffer.get(sequence);
event.setRunnable( inRunnable );
ringBuffer.publish(sequence);
}
}