disruptor学习

来源:互联网 发布:matlab创建三维数组 编辑:程序博客网 时间:2024/05/17 08:20

数据基类

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);        }    }   }
原创粉丝点击