Disruptor复杂场景下使用RingBuffer

在复杂场景下使用RingBuffer

(希望P1生产的数据给C1、C2并行执行,最后C1、C2执行结束后C3执行)

菱形

六边形

public class Main {

    public static void main(String[] args) throws InterruptedException {

        long beginTime = System.currentTimeMillis();
        int bufferSize =1024;
        ExecutorService executor = Executors.newFixedThreadPool(8);

        Disruptor<Trade> disruptor = new Disruptor<Trade>(new EventFactory<Trade>() {
            @Override
            public Trade newInstance() {
                return new Trade();
            }
        }, bufferSize, executor,ProducerType.SINGLE,new BusySpinWaitStrategy());

        //菱形操作
        //使用disruptor创建消费者组C1和C2
        /*EventHandlerGroup<Trade> handlerGroup = 
                disruptor.handleEventsWith(new Handler1(),new Handler2());
        handlerGroup.then(new Handler3());*/

        //顺序操作
        /*disruptor.handleEventsWith(new Handler1()).
            handleEventsWith(new Handler2()).
            handleEventsWith(new Handler3());*/

        //六边形操作
        Handler1 h1 = new Handler1();
        Handler2 h2 = new Handler2();
        Handler3 h3 = new Handler3();
        Handler4 h4 = new Handler4();
        Handler5 h5 = new Handler5();
        disruptor.handleEventsWith(h1,h2);
        disruptor.after(h1).handleEventsWith(h4);
        disruptor.after(h2).handleEventsWith(h5);
        disruptor.after(h4,h5).handleEventsWith(h3);

        disruptor.start();//启动
        CountDownLatch latch = new CountDownLatch(1);
        //生产者准备
        executor.submit(new TradePublisher(latch,disruptor));
        //等待生产者完事
        latch.await();
//      Thread.sleep(10);

        disruptor.shutdown();
        executor.shutdown();
        System.out.println("总耗时:"+(System.currentTimeMillis()-beginTime));
    }

}

TradeHandler类

public class TradePublisher implements Runnable {

    Disruptor<Trade> disruptor;
    private CountDownLatch latch;

    private static int LOOP = 10;//模拟百万次交易的发生

    public TradePublisher(CountDownLatch latch,Disruptor<Trade> disruptor) {
        this.disruptor=disruptor;
        this.latch=latch;
    }

    @Override
    public void run() {
        TradeEventTranslator tradeTranslator = new TradeEventTranslator();
        for(int i=0;i<LOOP;i++){
            disruptor.publishEvent(tradeTranslator);
        }
        latch.countDown();
    }
}

class TradeEventTranslator implements EventTranslator<Trade>{

    private Random random = new Random();

    //生产端填充数据
    @Override
    public void translateTo(Trade event, long sequence) {
        this.generateTrade(event);
    }

    private Trade generateTrade(Trade trade){
        trade.setPrice(random.nextDouble()*9999);
        return trade;
    }

}

Handler1类

public class Handler1 implements EventHandler<Trade> ,WorkHandler<Trade>{

    @Override
    public void onEvent(Trade event) throws Exception {
        this.onEvent(event);
    }

    @Override
    public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
        System.out.println("handler1: set name");
        event.setName("h1");
//      Thread.sleep(1000);
    }
}

Handler2类

public class Handler2 implements EventHandler<Trade>{

    @Override
    public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
        System.out.println("handler2 : set price");
        event.setPrice(17.0);
//      Thread.sleep(1000);
    }
}

Handler3类

public class Handler3 implements EventHandler<Trade>{

    @Override
    public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
        System.out.println("handler3: name: "+event.getName()+
                " , price: "+event.getPrice()+
                " ; instance: "+event.toString());
    }

}

Handler4类

public class Handler4 implements EventHandler<Trade>,WorkHandler<Trade>{

    @Override
    public void onEvent(Trade event) throws Exception {
        this.onEvent(event);
    }

    @Override
    public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
        System.out.println("Handler4: getName :"+event.getName());
        event.setName(event.getName()+"h4");
    }

}

Handler5类

public class Handler5 implements EventHandler<Trade>,WorkHandler<Trade>{

    @Override
    public void onEvent(Trade event) throws Exception {
        this.onEvent(event);
    }

    @Override
    public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
        System.out.println("Handler5 : getPrice :"+event.getPrice());
        event.setPrice(event.getPrice()+3.0);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值