什么是Disruptor

从功能上来看,Disruptor 是实现了“队列”的功能,而且是一个有界队列。那么它的应用场景自然就是“生产者-消费者”模型的应用场合了。
可以拿 JDK 的 BlockingQueue 做一个简单对比,以便更好地认识 Disruptor 是什么。
我们知道 BlockingQueue 是一个 FIFO 队列,生产者(Producer)往队列里发布(publish)一项事件(或称之为“消息”也可以)时,消费者(Consumer)能获得通知;如果没有事件时,消费者被堵塞,直到生产者发布了新的事件。
这些都是 Disruptor 能做到的,与之不同的是,Disruptor 能做更多:

  • 同一个“事件”可以有多个消费者,消费者之间既可以并行处理,也可以相互依赖形成处理的先后次序(形成一个依赖图);
  • 预分配用于存储事件内容的内存空间;
  • 针对极高的性能目标而实现的极度优化和无锁的设计;

以上虽然简单地描述了 Disruptor 是什么,但对于它"能做什么",还不是那么明白。简而言之,当你需要在两个独立的处理过程之间交换数据时,就可以使用 Disruptor 。当然使用队列也可以,只不过 Disruptor 的性能更好。

实战

本文先不具体去阐述Disruptor的工作具体原理,只是简单地将Spring与其整合。整合过程很简单,具体步骤如下:

  • 在pom文件中引入disruptor
<dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.4.2</version>
</dependency>
  • 创建事件
@Data
public class NotifyEvent {private String message;
}
  • 创建消息工厂用于生产消息
public class NotifyEventFactory implements EventFactory {@Overridepublic Object newInstance() {return new NotifyEvent();}
}
  • 创建消费者,此处用于处理业务逻辑
public class NotifyEventHandler implements EventHandler<NotifyEvent>,WorkHandler<NotifyEvent> {@Overridepublic void onEvent(NotifyEvent notifyEvent, long l, boolean b) throws Exception {System.out.println("接收到消息");this.onEvent(notifyEvent);}@Overridepublic void onEvent(NotifyEvent notifyEvent) throws Exception {System.out.println(notifyEvent+">>>"+UUID.randomUUID().toString());}
}
  • 自定义异常
@Log4j2
public class NotifyEventHandlerException implements ExceptionHandler {@Overridepublic void handleEventException(Throwable throwable, long sequence, Object event) {throwable.fillInStackTrace();log.error("process data error sequence ==[{}] event==[{}] ,ex ==[{}]", sequence, event.toString(), throwable.getMessage());}@Overridepublic void handleOnStartException(Throwable throwable) {log.error("start disruptor error ==[{}]!", throwable.getMessage());}@Overridepublic void handleOnShutdownException(Throwable throwable) {log.error("shutdown disruptor error ==[{}]!", throwable.getMessage());}
}
  • 整合Spring,对Disruptor进行初始化
@Service
public class NotifyServiceImpl implements INotifyService, DisposableBean,InitializingBean {private Disruptor<NotifyEvent> disruptor;private static final int RING_BUFFER_SIZE = 1024 * 1024;@Overridepublic void destroy() throws Exception {disruptor.shutdown();}@Overridepublic void afterPropertiesSet() throws Exception {disruptor = new Disruptor<NotifyEvent>(new NotifyEventFactory(),RING_BUFFER_SIZE, Executors.defaultThreadFactory(), ProducerType.SINGLE,new BlockingWaitStrategy());disruptor.setDefaultExceptionHandler(new NotifyEventHandlerException());disruptor.handleEventsWith(new NotifyEventHandler());disruptor.start();}@Overridepublic void sendNotify(String message) {RingBuffer<NotifyEvent> ringBuffer = disruptor.getRingBuffer();
//        ringBuffer.publishEvent(new EventTranslatorOneArg<NotifyEvent,  String>() {
//            @Override
//            public void translateTo(NotifyEvent event, long sequence, String data) {
//                event.setMessage(data);
//            }
//        }, message);ringBuffer.publishEvent((event, sequence, data) -> event.setMessage(data), message); //lambda式写法,如果是用jdk1.8以下版本使用以上注释的一段}
}
  • 在需要调用的地方注入INotifyService并调用sendNotify方法
  @GetMapping("test")@ResponseBodypublic String testLog() {log.info("=============");notifyService.sendNotify("Hello,World!");return "hello,world";}

Spring整合Disruptor3相关推荐

  1. Strutsw2与Spring整合流程-简述

    1.      新建WEB工程: 2.      导入struts2开发包,和资源配置文件 ① globalMessages.properties ② struts.properties 3.     ...

  2. 最新Spring整合MyBatis详解教程

    目录 1.导入相关jar包 1. junit 2. mybatis 3. mysql 4. spring相关 5. aop织入 6. mybatis-spring 7. lombok(选用) 2.回顾 ...

  3. Spring整合Struts2

    ①导入Struts2 jar包 ②在web.xml文件中创建过滤器 <?xml version="1.0" encoding="UTF-8"?> & ...

  4. shiro和Spring整合使用注解时没有执行realm的doGetAuthorizationInfo回调方法的解决

    shiro和Spring整合使用注解时没有执行realm的doGetAuthorizationInfo回调方法的解决 from :http://blog.csdn.net/babys/article/ ...

  5. Spring整合CXF,发布RSETful 风格WebService

    这篇文章是承接之前CXF整合Spring的这个项目示例的延伸,所以有很大一部分都是一样的.关于发布CXF WebServer和Spring整合CXF这里就不再多加赘述了.如果你对Spring整合CXF ...

  6. springMvc+mybatis+spring 整合 包涵整合activiti 基于maven

    2019独角兽企业重金招聘Python工程师标准>>> 最近自己独立弄一个activiti项目,写一下整合过程: 环境:jdk1.7 tomcat7.0 maven3.5  ecli ...

  7. activiti自己定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义

    注:(1)环境搭建:activiti自己定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建         (2)创建流程模型:activiti自己定义流程之Spr ...

  8. Spring 整合 Junit

    Spring 整合 Junit 问题 在测试类中,每个测试方法都有以下两行代码: ApplicationContext ac = new ClassPathXmlApplicationContext( ...

  9. spring整合mybatis(入门级简单教程1)--在spring中配置c3p0,并成功测试

    引子:spring整合mybatis.因为,我们看完(我就是这样的)spring和mybatis之后,本想自己写一个小小的项目,以便加深理解,但是我发现在spring中整合mybatis并不是一件容易 ...

最新文章

  1. 计算机应用技术挂科率高吗,大学里“挂科率高”的专业,学霸也觉得吃力,填报志愿要慎重...
  2. 数据产品设计专题(5)- 分布式数据仓库技术架构
  3. BZOJ4031: [HEOI2015]小Z的房间
  4. poj 1061 (扩展欧几里德算法)
  5. Linux下读写芯片的I2C寄存器
  6. leetcode初级算法6.字符串转整数(atoi)
  7. 【AI视野·今日CV 计算机视觉论文速览 第244期】Fri, 15 Apr 2022
  8. 在windows上搭建redis集群(Redis-Cluster)
  9. IOS上从第三方页面回跳VUE页面页面不刷新问题
  10. 福利来啦!!Python基础语法干货
  11. 在非MVC环境下使用 Razor引擎
  12. (day 23 - 中位数 投票法 )剑指 Offer 39. 数组中出现次数超过一半的数字
  13. linux 下载hbase源码,linux上安装hbase(示例代码)
  14. ModifyStyle ModifyStyleEx修改自定义控件的问题
  15. 聊天ai机器人_适用于您网站的14种最佳AI聊天机器人软件(已比较)
  16. word中如何插入参考文献
  17. 走出NASA,向大地“下战书”,他要用卫星遥感数据改变中国农业
  18. 【JVM】运行时数据区概述(程序计数器、虚拟机栈、本地方法栈)
  19. 微信公众号扫码授权登录思路
  20. win10 旗舰版 系统激活出现 在连接到本地注册表时出现错误0x80041002 提示信息 解决方法...

热门文章

  1. Sql Server插入数据并返回自增ID,@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的区别
  2. Atitit.Java exe bat  作为windows系统服务程序运行
  3. Spark 1.6发布:引入Dataset接口
  4. android学习第5天(周六日没学,可惜啊,神驰物外了)
  5. ASP.NET 调味品:AJAX
  6. Intel芯片组命名规则
  7. C#线程、前后台线程
  8. ###修改图片为圆形
  9. 从零开始学_JavaScript_系列(24)——查看对象属性,合并数组
  10. cookie存放位置