package com.test;
import com.lmax.disruptor.BatchEventProcessor;
import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.SequenceBarrier;
import com.lmax.disruptor.SingleThreadedClaimStrategy;
import com.lmax.disruptor.YieldingWaitStrategy;
public class DisruptorUtils {
/**
* ringbuffer�����������2��N�η�
*/
private static final int BUFFER_SIZE = 1024 * 8;
private RingBuffer<LongEventFactory> ringBuffer;
private SequenceBarrier sequenceBarrier;
private LongEventHandler handler;
private BatchEventProcessor<LongEventFactory> batchEventProcessor;
private static DisruptorUtils instance;
private static boolean inited = false;
private DisruptorUtils() {
ringBuffer = new RingBuffer<LongEventFactory>(LongEventFactory.EVENT_FACTORY,
new SingleThreadedClaimStrategy(BUFFER_SIZE),
new YieldingWaitStrategy());
sequenceBarrier = ringBuffer.newBarrier();
handler = new LongEventHandler();
batchEventProcessor = new BatchEventProcessor<LongEventFactory>(
ringBuffer, sequenceBarrier, handler);
ringBuffer.setGatingSequences(batchEventProcessor.getSequence());
}
public static void initAndStart() {
instance = new DisruptorUtils();
new Thread(instance.batchEventProcessor).start();
inited = true;
}
public static void shutdown() {
if (!inited) {
throw new RuntimeException("Disruptor��û�г�ʼ����");
}
instance.shutdown0();
}
private void shutdown0() {
batchEventProcessor.halt();
}
private void produce0(LongEvent deliveryReport) {
// ��ȡ��һ�����к�
long sequence = ringBuffer.next();
// ��״̬�������ringBuffer�ĸ����к���
ringBuffer.get(sequence).setDeliverObject(deliveryReport);
// ֪ͨ����߸���Դ�������
ringBuffer.publish(sequence);
}
/**
* ��״̬���������Դ���У��ȴ���
*
* @param deliveryReport
*/
public static void produce(LongEvent deliveryReport) {
if (!inited) {
throw new RuntimeException("Disruptor��û�г�ʼ����");
}
instance.produce0(deliveryReport);
}
}