数据基类
public class Data {
private String id;
private String name;
private String age;
public Data() {
}
public Data(String id, String name, String age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
ringBuffer环
public class DataRingBuffer {
private static RingBuffer<Data> ringbuffer;
private static EventFactory<Data> factory = new EventFactory<Data>() {
@Override
public Data newInstance() {
return new Data();
}
};
private DataRingBuffer() {
//ringbuffer = RingBuffer.create(ProducerType.MULTI, factory, 4 * 1024, new SleepingWaitStrategy());
//create(ProducerType producerType, //生产者类型:单个SingleProducerSequencer 多个MultiProducerSequencer
// EventFactory<E> factory,
// int bufferSize,
// WaitStrategy waitStrategy)
}
public static RingBuffer<Data> getRingBuffer() {
if (ringbuffer == null) {
synchronized (DataRingBuffer.class) {
if (ringbuffer == null) {
ringbuffer = RingBuffer.create(ProducerType.MULTI, factory, 4 * 1024, new SleepingWaitStrategy());
}
}
}
return ringbuffer;
}
/**
* 往环里增加数据
* @param commondRole
*/
public void publish(Data t) {
long next = -1;
try {
next = ringBuffer.next();
Data data = ringBuffer.get(next);
data.setAge(t.getAge());
data.setId(t.getId());
data.setName(t.getName());
ringBuffer.publish(next);
} catch (Throwable e) {
//
} finally {
if (next != -1) {
ringBuffer.publish(next);
}
}
}
}
处理数据类1
public class DataHandle implements EventHandler<Data>{
@Override
public void onEvent(Data event, long sequence, boolean endOfBatch) throws Exception {
System.out.println("数据处理:"+event.getId()+"=="+event.getName()+"=="+event.getAge());
System.out.println(Thread.currentThread().getName());
}
}
处理数据类2
public class DataHandle2 implements EventHandler<Data>{
@Override
public void onEvent(Data event, long sequence, boolean endOfBatch) throws Exception {
System.out.println("DataHandle2数据处理:"+event.getId()+"新的处理"+"=="+event.getName()+"=="+event.getAge());
}
}
测试处理数据:
public static void test1() {
//数据类,维护一个Ringbuffer,并有返回Ringbuffer实例对象的方法
//DataRingBuffer dataRing=new DataRingBuffer();
//获取一个Ringbuffer实例
//RingBuffer<Data> ringBuffer =dataRing.getRingBuffer();
RingBuffer<Data> ringBuffer=DataRingBuffer.getRingBuffer();
//消费者与RingBuffer之间的桥梁
SequenceBarrier newBarrier=ringBuffer.newBarrier();
//数据处理 自定义处理逻辑
EventHandler<Data> handle=new DataHandle();
//final DataProvider<T> dataProvider,RingBuffer实现了接口(EventSequencer)
//final SequenceBarrier sequenceBarrier,
//事件处理器 //final EventHandler<? super T> eventHandler)
BatchEventProcessor<Data> processor= new BatchEventProcessor<Data>(ringBuffer, newBarrier, handle);
//添加特定的顺序控制 安全并自动添加到序列清单
ringBuffer.addGatingSequences(processor.getSequence());
//创建线程池 ExecutorService管理线程,并提供停止方法
ExecutorService threadPool=Executors.newCachedThreadPool();
//提交任务 实现runable接口
threadPool.submit(processor);
for(int i=0;i<100;i++){
//申请空间存放数据
long sequence=ringBuffer.next();
Data data=ringBuffer.get(sequence);
data.setId("0"+i);
data.setAge("222");
data.setName("333");
ringBuffer.publish(sequence);
}
// threadPool.shutdown();//停止线程
}
测试前后处理数据:
public static void test2() {
Executor executor=Executors.newCachedThreadPool();
Disruptor<Data> disruptor = new Disruptor<Data>(new EventFactory<Data>() {
@Override
public Data newInstance() {
return new Data();
}
},4*1024,executor, ProducerType.SINGLE,new BlockingWaitStrategy());
EventHandler<Data> handle1=new DataHandle();
EventHandler<Data> handle2=new DataHandle2();
//处理器1处理完,扔给处理器2处理(1)
// SequenceBarrier sequenceBarrier=disruptor.handleEventsWith(handle1).asSequenceBarrier();
// BatchEventProcessor<Data> processor= new BatchEventProcessor<Data>(disruptor.getRingBuffer(), sequenceBarrier, handle2);
// disruptor.handleEventsWith(processor);
//处理器1处理完,扔给处理器2处理(2)
SequenceBarrier sequenceBarrier=disruptor.handleEventsWith(handle1).asSequenceBarrier();
disruptor.after(handle1).handleEventsWith(handle2);
RingBuffer<Data> ringBuffer=disruptor.start();;
for(int i=0;i<10;i++){
long sequence=ringBuffer.next();
Data data=ringBuffer.get(sequence);
data.setId("0"+i);
data.setAge("222");
data.setName("333");
ringBuffer.publish(sequence);
}
}
简单封装:
public class DisruptorTest {
//数据类,维护一个Ringbuffer,并有返回Ringbuffer实例对象的方法
DataRingBuffer dataRing = new DataRingBuffer();
//获取一个Ringbuffer实例
RingBuffer<Data> ringBuffer = dataRing.getRingBuffer();
//消费者与RingBuffer之间的桥梁
SequenceBarrier newBarrier = ringBuffer.newBarrier();
//数据处理 自定义处理逻辑
EventHandler<Data> handle = new DataHandle();
//final DataProvider<T> dataProvider,RingBuffer实现了接口(EventSequencer)
//final SequenceBarrier sequenceBarrier,
//事件处理器 //final EventHandler<? super T> eventHandler)
BatchEventProcessor<Data> processor = new BatchEventProcessor<Data>(ringBuffer, newBarrier, handle);
@Before
public void init() {
//添加特定的顺序控制 安全并自动添加到序列清单
ringBuffer.addGatingSequences(processor.getSequence());
//创建线程池 ExecutorService管理线程,并提供停止方法
ExecutorService threadPool = Executors.newCachedThreadPool();
//提交任务 实现runable接口
threadPool.submit(processor);
}
@Test
public void test() throws Exception {
for (int i = 0; i < 100; i++) {
Thread.sleep(1000);
Data data =new Data();
data.setAge("444");
data.setId("{"+i+"}");
dataRing.publish(data);
}
}
}