disruptor 入门 一

本文详细介绍了Disruptor框架的基本概念,包括其核心组件的实现与应用。通过具体示例,展示了如何构建事件监听类处理数据,实例化Disruptor并配置参数,以及编写生产者组件向容器投递数据的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、disruptor基本概念

 https://www.cnblogs.com/haiq/p/4112689.html

 

二、disruptor入门程序

导入disruptor包

<dependency>
       <groupId>com.lmax</groupId>
       <artifactId>disruptor</artifactId>
       <version>3.3.2</version>
</dependency>

 

实现disruptor的四部操作

1.建立一个工厂Event类,用于创建Event类实例对象

public class OrderEvent {

    private long value;

    public long getValue() {
        return value;
    }

    public void setValue(long value) {
        this.value = value;
    }
}
public class OrderEventFactory implements EventFactory<OrderEvent> {

    @Override
    public OrderEvent newInstance() {
        return new OrderEvent();    //这个方法就是为了返回空的数据对象Event
    }
}

 

2.创建事件监听类,用于处理数据

import com.lmax.disruptor.EventHandler;

public class OrderEventHandler implements EventHandler<OrderEvent> {

    @Override
    public void onEvent(OrderEvent orderEvent, long l, boolean b) throws Exception {
        System.out.println("消费者:"+orderEvent.getValue());
    }
}

 

3.实例化Disruptor实例,配置一系列的参数,编写Disruptory核心组件

public static void main(String[] args) {
        OrderEventFactory orderEventFactory = new OrderEventFactory();
        int ringBufferSize = 1024 * 1024;//指定容器的大小
        ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); //指定线程,建议使用自定义线程池

        /**
         * 1.实例化disruptor对象
         * 参数一:orderEventFactory 消息(event)工厂对象
         * 参数二:ringBufferSize 容器的长度
         * 参数三:线程池(建议使用自定义线程池)RejectedExecutionHandler
         * 参数四:ProducerType 单生产者还是多生产者
         * 参数五:waitStrategy 等待策略
         */
        Disruptor<OrderEvent> disruptor = new Disruptor<OrderEvent>(orderEventFactory, ringBufferSize, executorService, ProducerType.SINGLE, new BlockingWaitStrategy());

        //2.添加消费者的监听
        disruptor.handleEventsWith(new OrderEventHandler());

        //3.启动disruptor
        disruptor.start();

        //4.获取实际存储数据的容器: RingBuffer
        RingBuffer<OrderEvent> ringBuffer = disruptor.getRingBuffer();

        OrderEventProducer producer = new OrderEventProducer(ringBuffer);

        ByteBuffer byteBuffer = ByteBuffer.allocate(8);

        for (long i = 0; i < 100; i++) {
            byteBuffer.putLong(0, i);
            producer.sendData(byteBuffer);
        }
        disruptor.shutdown();
        executorService.shutdown();
    }

 

4.编写生产者组件,向Disruptor容器中去投递数据 (此步骤对应上述main方法中的4)

import com.lmax.disruptor.RingBuffer;
import java.nio.ByteBuffer;

public class OrderEventProducer {

    private RingBuffer<OrderEvent> ringBuffer;

    public OrderEventProducer(RingBuffer<OrderEvent> ringBuffer) {
        this.ringBuffer = ringBuffer;
    }

    public void sendData(ByteBuffer data) {

        //1 在生产者发送消息的时候,首先需要从 ringBuffer 中获取一个可用的序号
        long sequence = ringBuffer.next();
        try {
            //2 根据这个序号找到具体的 OrderEvent 元素,草地上获取的OrderEvent对象是一个没有被赋值的空对象
            OrderEvent orderEvent = ringBuffer.get(sequence);

            //3 进行时间赋值处理
            orderEvent.setValue(data.getLong(0));
        } finally {
            //4 提交操作
            ringBuffer.publish(sequence);
        }
    }
}

 

转载于:https://www.cnblogs.com/gyli20170901/p/10233170.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值