ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

三步创建Disruptor应用

2020-04-02 19:00:09  阅读:234  来源: 互联网

标签:Disruptor disruptor 创建 object ObjectEvent public 三步 event


三步创建Disruptor应用

Disruptor是一个高性能的用于线程间消息处理的开源框架。它的目标就是.
我们知道,java.util.concurrent.ArrayBlockingQueue 是一个非常优秀的有界队列实现。Disruptor与之相比,性能更加的优秀。
性能比较性能比较
完整的性能报告在这里.

Disruptor内部使用了RingBuffer,它是Disruptor的核心的数据结构。和其它的RingBuffer实现不同,Disruptor没有尾指针。这样实现是经过深思熟虑的,你可以看这篇文档了解其细节。
更多的参考资料请参照官方文档以及并发编程网上翻译的一些文章

本文主要参考Disruptor入门这篇文章。

本文的代码已全部放在github上。

在正式使用Disruptor之前,我们先声明一个ObjectEvent类,它用来传递消息的内容。

1 2 3 4 5 6 7 8 9 10 11 12 13 public class ObjectEvent { private Object object;   public Object getObject() { return object; }   public ObjectEvent setObject(Object object) { this.object = object; return this; }   }
  • 第一步,创建一个Disruptor对象
1 2 3 4 Executor executor = Executors.newCachedThreadPool(); int bufferSize = 1024; Disruptor<ObjectEvent> disruptor = new Disruptor<>(ObjectEvent::new, bufferSize, executor, ProducerType.SINGLE, new LiteBlockingWaitStrategy());

这是一个单一生产者的例子,如果在你的代码中仅仅有一个事件生产者,那么可以设置为单一生产者模式来提高系统的性能。

第一个参数用来在ring buffer中创建event,第二个参数是ring buffer的大小,第三个参数是消费者处理消息而使用的线程池。第四个参数是单或者多生产者模式,地五个参数是可选的等待策略。
以上代码主要用来设置RingBuffer.

  • 第二步,创建消息处理的processors
1 2 3 4 5 6 7 8 9 10 public static void handleEvent1(ObjectEvent event, long sequence, boolean endOfBatch) { System.out.println("handler-1: " + event.getObject()); } public static void handleEvent2(ObjectEvent event, long sequence, boolean endOfBatch) { System.out.println("handler-2: " + event.getObject()); } ... disruptor.handleEventsWith(App::handleEvent1); disruptor.handleEventsWith(App::handleEvent2); ...

定义了两个processor,并使用handleEventsWith注册到Disruptor。注意这个方法可以使用职责链模式,例如handleEventsWith(A).then(B)
然后就可以启动Disruptor了:

1 disruptor.start();
  • 第三步,创建生产者
    这一步我们可以创建一个生产者来发布消息(事件)。
1 2 3 4 5 6 7 8 private static void produceEvents(Disruptor<ObjectEvent> disruptor) throws InterruptedException { RingBuffer<ObjectEvent> ringBuffer = disruptor.getRingBuffer(); for (long l = 0; true; l++) { String obj = "Test-" + l; ringBuffer.publishEvent((event, sequence) -> event.setObject(obj)); Thread.sleep(1000); } }

通过以上三步,我们就可以创建一个简单的应用Disruptor的例子了。

标签:Disruptor,disruptor,创建,object,ObjectEvent,public,三步,event
来源: https://www.cnblogs.com/muzhongjiang/p/12622319.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有