disruptor框架java实例_java架构《并发编程框架篇 __Disruptor》

Disruptor入门

获得Disruptor

可以通过Maven或者下载jar来安装Disruptor。只要把对应的jar放在Java classpath就可以了。

基本的事件生产和消费

我们从一个简单的例子开始学习Disruptor:生产者传递一个long类型的值给消费者,而消费者消费这个数据的方式仅仅是把它打印出来。首先声明一个Event来包含需要传递的数据:

1 public classLongEvent {2 private longvalue;3 public longgetValue() {4 returnvalue;5 }6

7 public void setValue(longvalue) {8 this.value =value;9 }10 }

由于需要让Disruptor为我们创建事件,我们同时还声明了一个EventFactory来实例化Event对象。

1 public class LongEventFactory implementsEventFactory {2 @Override3 publicObject newInstance() {4 return newLongEvent();5 }6 }

我们还需要一个事件消费者,也就是一个事件处理器。这个事件处理器简单地把事件中存储的数据打印到终端:

1 /**

2 */public class LongEventHandler implements EventHandler{3 @Override4 public void onEvent(LongEvent longEvent, long l, boolean b) throwsException {5 System.out.println(longEvent.getValue());6 }7 }

事件都会有一个生成事件的源,这个例子中假设事件是由于磁盘IO或者network读取数据的时候触发的,事件源使用一个ByteBuffer来模拟它接受到的数据,也就是说,事件源会在IO读取到一部分数据的时候触发事件(触发事件不是自动的,程序员需要在读取到数据的时候自己触发事件并发布):

1 public classLongEventProducer {2 private final RingBufferringBuffer;3 public LongEventProducer(RingBufferringBuffer) {4 this.ringBuffer =ringBuffer;5 }6

7 /**

8 * onData用来发布事件,每调用一次就发布一次事件事件9 * 它的参数会通过事件传递给消费者10 *11 *@parambb12 */public voidonData(ByteBuffer bb) {13 //可以把ringBuffer看做一个事件队列,那么next就是得到下面一个事件槽

14 long sequence = ringBuffer.next();try{15 //用上面的索引取出一个空的事件用于填充

16 LongEvent event = ringBuffer.get(sequence);//for the sequence

17 event.setValue(bb.getLong(0));18 } finally{19 //发布事件

20 ringBuffer.publish(sequence);21 }22 }23 }

很明显的是:当用一个简单队列来发布事件的时候会牵涉更多的细节,这是因为事件对象还需要预先创建。发布事件最少需要两步:获取下一个事件槽并发布事件(发布事件的时候要使用try/finnally保证事件一定会被发布)。如果我们使用RingBuffer.next()获取一个事件槽,那么一定要发布对应的事件。如果不能发布事件,那么就会引起Disruptor状态的混乱。尤其是在多个事件生产者的情况下会导致事件消费者失速,从而不得不重启应用才能会恢复。

Disruptor 3.0提供了lambda式的API。这样可以把一些复杂的操作放在Ring Buffer,所以在Disruptor3.0以后的版本最好使用Event Publisher或者Event Translator来发布事件。

1 public classLongEventProducerWithTranslator {2 //一个translator可以看做一个事件初始化器,publicEvent方法会调用它3 //填充Event

4 private static final EventTranslatorOneArg TRANSLATOR =

5 new EventTranslatorOneArg() {6 public void translateTo(LongEvent event, longsequence, ByteBuffer bb) {7 event.setValue(bb.getLong(0));8 }9 };10 private final RingBufferringBuffer;11 public LongEventProducerWithTranslator(RingBufferringBuffer) {12 this.ringBuffer =ringBuffer;13 }14

15 public voido

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值