disruptor学习

数据基类

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);
        }
    }
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值