Disruptor并发框架使用二

一、Disruptor场景使用
   我们在创建Disruptor框架实例的时候,我们可以直接使用RingBuffer,以及其他的API操作。
   场景1:使用EventProcessor消息处理器或者使用WorkerPool消息处理器

   使用EventProcessor消息处理器示例:

public class ProductDto  {
    private String  id;
    private String name;
    private BigDecimal price;
    private AtomicInteger count = new AtomicInteger();
}
public class ProductHandler implements  WorkHandler<ProductDto>,EventHandler<ProductDto> {

    public void onEvent(ProductDto event,long sequence,long endOfBatch) throws Exception {
        this.onEvent(event);
    }


    @Override
    public void onEvent(ProductDto event) throws Exception {
        // 此处做具体的消费逻辑
        event.setId(UUID.randomUUID().toString());
        System.out.println(event.getId());
    }
 }
public class Main1 {

    @Test
    public  void test01() throws ExecutionException, InterruptedException {
        final  int buffer_size = 1024 ;
        final  int threads_size = 4;

        /** createSingleProducer  创建一个单生产者的ringbuffer
         *   第一个参数:事件工厂,主要是产生数据和填充Ringbuffer区域
         *   第二个参数:指的是RingBuffer的大小,必须是2的指数倍,目的是求模运算转化为&运算提高效率
         *   第三个参数:RingBuffer的生产都在没有可用区块的时候(可能消费者或者事件处理器),太慢的等待策略,
         */
       final RingBuffer<ProductDto> ringBuffer = RingBuffer.createSingleProducer(new EventFactory<ProductDto>() {
            @Override
            public ProductDto newInstance() {
                return new ProductDto();
            }
        }, buffer_size, new YieldingWaitStrategy());

       // 线程池
        ExecutorService executors = Executors.newFixedThreadPool(threads_size);

        // 创建sequenceBarrier
        SequenceBarrier sequenceBarrier = ringBuffer.newBarrier();

        // 创建消息处理器
        BatchEventProcessor<ProductDto> transProcessor = new BatchEventProcessor<ProductDto>(ringBuffer, sequenceBarrier, new ProductHandler());

        // 目的是把消费者的位置信息引用注入到生产者,如果只有一个消费者可以忽略
        ringBuffer.addGatingSequences(transProcessor.getSequence());

        // 把消息处理器提交到线程池
       executors.submit(transProcessor);

       // 如果存在多个消费者,那重复执行上面的3行代码,把ProductHandler转化为其他的消费类
        Future<Void> future = executors.submit(new Callable<Void>() {
            @Override
            public Void call() throws Exception {
                long seq;
                for (int i = 0; i < 10; i++) {
                    seq = ringBuffer.next(); // ringbuffer 一个可用区块,先占一个位置
                    ringBuffer.get(seq).setPrice(new BigDecimal(Math.random() * 111)); // 给此区块放入数据
                    ringBuffer.publish(seq); // 发布这个区块的数据使handler(consumer)可见

                }
                return null;
            }
        });
        future.get(); // 等到生产者结束
        Thread.sleep(1000); // 等待1秒,消费者都处理完成
        transProcessor.halt(); // 通知事件(消息)处理器,可以结束了,并不代表马上结束
        executors.shutdown(); // 终止线程
    }
}
public class Main2 {  
    public static void main(String[] args) throws InterruptedException {  
        int BUFFER_SIZE=1024;  
        int THREAD_NUMBERS=4;  
        
        EventFactory<Trade> eventFactory = new EventFactory<Trade>() {  
            public Trade newInstance() {  
                return new Trade();  
            }  
        };  
        
        RingBuffer<Trade> ringBuffer = RingBuffer.createSingleProducer(eventFactory, BUFFER_SIZE);  
          
        SequenceBarrier sequenceBarrier = ringBuffer.newBarrier();  
          
        ExecutorService executor = Executors.newFixedThreadPool(THREAD_NUMBERS);  
          
        WorkHandler<Trade> handler = new TradeHandler();  

        WorkerPool<Trade> workerPool = new WorkerPool<Trade>(ringBuffer, sequenceBarrier, new IgnoreExceptionHandler(), handler);  
          
        workerPool.start(executor);  
          
        //下面这个生产8个数据
        for(int i=0;i<8;i++){  
            long seq=ringBuffer.next();  
            ringBuffer.get(seq).setPrice(Math.random()*9999);  
            ringBuffer.publish(seq);  
        }  
          
        Thread.sleep(1000);  
        workerPool.halt();  
        executor.shutdown();  
    }  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值