disruptor多消费者实现

网上看了很多资料,很多都说到了多消费者,但没有找到多消费者并行消费不同事件消息,自己于是抽出了一下午时间研究了一下,具体代码实现如下(实例代码根据官方的git更改,本文基于3.3.6最新版本):

//定义时间工厂
		LongEventFactory factory = new LongEventFactory();
		//定义初始化ringBuffer大小,创建ringBuffer的时候会根据这个大小进行预先填充
		int bufferSize = 16;
		//定义线程池
		Executor threadPool = Executors.newCachedThreadPool();
		//创建ringBuffer
		RingBuffer<LongEvent> ringBuffer = RingBuffer.create(ProducerType.SINGLE, factory, bufferSize,
				new SleepingWaitStrategy());
		//创建一个事件生产者
		LongEventProducer producer = new LongEventProducer(ringBuffer);
		int i = 1;
		while (i++ <= bufferSize) {
			//发布一个事件
			producer.onData();
		}
		SequenceBarrier sequenceBarrier = ringBuffer.newBarrier();
		//重点是这个消费序列,所有的消费者处理都必须共享一个消费序列
		Sequence consumerSequence = new Sequence(-1);
		//定义事件处理
		LongEventHandler eventHandler = new LongEventHandler("测试1");
		WorkProcessor<LongEvent> wp1 = new WorkProcessor<LongEvent>(ringBuffer, sequenceBarrier, eventHandler, eventHandler, consumerSequence);
		//执行处理线程
		threadPool.execute(wp1);
		WorkProcessor<LongEvent> wp2 = new WorkProcessor<LongEvent>(ringBuffer, sequenceBarrier, eventHandler, eventHandler, consumerSequence);
		threadPool.execute(wp2);
		WorkProcessor<LongEvent> wp3 = new WorkProcessor<LongEvent>(ringBuffer, sequenceBarrier, eventHandler, eventHandler, consumerSequence);
		threadPool.execute(wp3);
		WorkProcessor<LongEvent> wp4 = new WorkProcessor<LongEvent>(ringBuffer, sequenceBarrier, eventHandler, eventHandler, consumerSequence);
		threadPool.execute(wp4);

注意:以上所有的WorkProcessor都共享了一个consumerSequence,所以他们在从ringBuffer里面取数据的时候,不会出现取出同一事件发布的数据;

WorkProcessor的run方法关键源码如下:

do{
                    	//这个workSequence就是我们前面传进来的consumerSequence
                        nextSequence = workSequence.get() + 1L;
                        sequence.set(nextSequence - 1L);
                    }
                    //这个地方会使用CAS的方法保证每次都是递增
                    while (!workSequence.compareAndSet(nextSequence - 1L, nextSequence));

测试结果如下:

190832_uI9O_2893762.png

4个线程共同消费事件,未出现同一个事件被两个线程同时消费

相关连接:https://github.com/LMAX-Exchange/disruptor

 

 

 

 

转载于:https://my.oschina.net/jwang/blog/798432

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值