Disruptor 实例

来源:互联网 发布:php集成开发工具 编辑:程序博客网 时间:2024/06/06 17:31

这里写图片描述

如图:

      从中图可以看出需求是介样子的:生产者生产数据经过C1,C2处理完成后再到C3。假设如下场景:1、交易网关收到交易(P1)把交易数据发到RingBuffer中,2、负责处理增值业务的消费者C1和负责数据存储的消费者C2负责处理交易3、负责发送JMS消息的消费者C3在C1和C2处理完成后再进行处理。
import com.lmax.disruptor.BusySpinWaitStrategy;import com.lmax.disruptor.EventFactory;import com.lmax.disruptor.dsl.Disruptor;import com.lmax.disruptor.dsl.EventHandlerGroup;import com.lmax.disruptor.dsl.ProducerType;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * Created by aires on 2017/2/9. */public class DisruptorWithConsumerAndProductorDemo {    public static void main(String[] args) throws InterruptedException {        long beginTime=System.currentTimeMillis();        int bufferSize=1024;        ExecutorService executor= Executors.newFixedThreadPool(4);        Disruptor<TradeTransaction> disruptor=new Disruptor<TradeTransaction>(new EventFactory<TradeTransaction>() {            public TradeTransaction newInstance() {                return new TradeTransaction();            }        }, bufferSize, executor, ProducerType.SINGLE, new BusySpinWaitStrategy());        //使用disruptor创建消费者组C1,C2        EventHandlerGroup<TradeTransaction> handlerGroup=disruptor.handleEventsWith(new TradeTransactionVasConsumer(),new TradeTransactionInDBHandler());        TradeTransactionJMSNotifyHandler jmsConsumer=new TradeTransactionJMSNotifyHandler();        //声明在C1,C2完事之后执行JMS消息发送操作 也就是流程走到C3        handlerGroup.then(jmsConsumer);        disruptor.start();//启动        CountDownLatch latch=new CountDownLatch(1);        //生产者准备        executor.submit(new TradeTransactionPublisher(latch, disruptor));        latch.await();//等待生产者完事.        disruptor.shutdown();        executor.shutdown();        System.out.println("总耗时:"+(System.currentTimeMillis()-beginTime));    }}
import com.lmax.disruptor.EventHandler;/** * Created by aires on 2017/2/9. */public class TradeTransactionJMSNotifyHandler implements EventHandler<TradeTransaction> {    public void onEvent(TradeTransaction event, long sequence,                        boolean endOfBatch) throws Exception {        //do send jms message    }}
import com.lmax.disruptor.dsl.Disruptor;import java.util.concurrent.CountDownLatch;/** * Created by aires on 2017/2/9. */public class TradeTransactionPublisher implements Runnable{    Disruptor<TradeTransaction> disruptor;    private CountDownLatch latch;    private static int LOOP=10000000;//模拟一千万次交易的发生    public TradeTransactionPublisher(CountDownLatch latch,Disruptor<TradeTransaction> disruptor) {        this.disruptor=disruptor;        this.latch=latch;    }    public void run() {        TradeTransactionEventTranslator tradeTransloator=new TradeTransactionEventTranslator();        for(int i=0;i<LOOP;i++){            disruptor.publishEvent(tradeTransloator);        }        latch.countDown();    }}
import com.lmax.disruptor.EventTranslator;import java.util.Random;/** * Created by aires on 2017/2/9. */public class TradeTransactionEventTranslator implements EventTranslator<TradeTransaction> {    private Random random=new Random();    public void translateTo(TradeTransaction event, long sequence) {        this.generateTradeTransaction(event);    }    private TradeTransaction generateTradeTransaction(TradeTransaction trade){        trade.setPrice(random.nextDouble()*9999);        return trade;    }}
import com.lmax.disruptor.EventHandler;/** * Created by aires on 2017/2/9. */public class TradeTransactionVasConsumer implements EventHandler<TradeTransaction> {    public void onEvent(TradeTransaction event, long sequence,                        boolean endOfBatch) throws Exception {        //do something....    }}
0 0