并发框架Disruptor场景应用
- public class MyInParkingDataEvent {
- private String carLicense; // 车牌号
- public String getCarLicense() {
- return carLicense;
- }
- public void setCarLicense(String carLicense) {
- this.carLicense = carLicense;
- }
- }
Handler类:一个负责存储汽车数据,一个负责发送kafka信息到其他系统中,最后一个负责给车主发短信通知
- import com.lmax.disruptor.EventHandler;
- import com.lmax.disruptor.WorkHandler;
- /**
- * Handler 第一个消费者,负责保存进场汽车的信息
- *
- */
- public class MyParkingDataInDbHandler implements EventHandler<MyInParkingDataEvent> , WorkHandler<MyInParkingDataEvent>{
- @Override
- public void onEvent(MyInParkingDataEvent myInParkingDataEvent) throws Exception {
- long threadId = Thread.currentThread().getId(); // 获取当前线程id
- String carLicense = myInParkingDataEvent.getCarLicense(); // 获取车牌号
- System.out.println(String.format("Thread Id %s 保存 %s 到数据库中 ....", threadId, carLicense));
- }
- @Override
- public void onEvent(MyInParkingDataEvent myInParkingDataEvent, long sequence, boolean endOfBatch)
- throws Exception {
- this.onEvent(myInParkingDataEvent);
- }
- }
- import com.lmax.disruptor.EventHandler;
- /**
- * 第二个消费者,负责发送通知告知工作人员(Kafka是一种高吞吐量的分布式发布订阅消息系统)
- */
- public class MyParkingDataToKafkaHandler implements EventHandler<MyInParkingDataEvent>{
- @Override
- public void onEvent(MyInParkingDataEvent myInParkingDataEvent, long sequence, boolean endOfBatch)
- throws Exception {
- long threadId = Thread.currentThread().getId(); // 获取当前线程id
- String carLicense = myInParkingDataEvent.getCarLicense(); // 获取车牌号
- System.out.println(String.format("Thread Id %s 发送 %s 进入停车场信息给 kafka系统...", threadId, carLicense));
- }
- }
- import com.lmax.disruptor.EventHandler;
- /**
- * 第三个消费者,sms短信服务,告知司机你已经进入停车场,计费开始。
- */
- public class MyParkingDataSmsHandler implements EventHandler<MyInParkingDataEvent>{
- @Override
- public void onEvent(MyInParkingDataEvent myInParkingDataEvent, long sequence, boolean endOfBatch)
- throws Exception {
- long threadId = Thread.currentThread().getId(); // 获取当前线程id
- String carLicense = myInParkingDataEvent.getCarLicense(); // 获取车牌号
- System.out.println(String.format("Thread Id %s 给 %s 的车主发送一条短信,并告知他计费开始了 ....", threadId, carLicense));
- }
- }
Producer类:负责上报停车数据
- import java.util.concurrent.CountDownLatch;
- import com.lmax.disruptor.EventTranslator;
- import com.lmax.disruptor.dsl.Disruptor;
- /**
- * 生产者,进入停车场的车辆
- */
- public class MyInParkingDataEventPublisher implements Runnable{
- private CountDownLatch countDownLatch; // 用于监听初始化操作,等初始化执行完毕后,通知主线程继续工作
- private Disruptor<MyInParkingDataEvent> disruptor;
- private static final Integer NUM = 1; // 1,10,100,1000
- public MyInParkingDataEventPublisher(CountDownLatch countDownLatch,
- Disruptor<MyInParkingDataEvent> disruptor) {
- this.countDownLatch = countDownLatch;
- this.disruptor = disruptor;
- }
- @Override
- public void run() {
- MyInParkingDataEventTranslator eventTranslator = new MyInParkingDataEventTranslator();
- try {
- for(int i = 0; i < NUM; i ++) {
- disruptor.publishEvent(eventTranslator);
- Thread.sleep(1000); // 假设一秒钟进一辆车
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- } finally {
- countDownLatch.countDown(); // 执行完毕后通知 await()方法
- System.out.println(NUM + "辆车已经全部进入进入停车场!");
- }
- }
- }
- class MyInParkingDataEventTranslator implements EventTranslator<MyInParkingDataEvent> {
- @Override
- public void translateTo(MyInParkingDataEvent myInParkingDataEvent, long sequence) {
- this.generateData(myInParkingDataEvent);
- }
- private MyInParkingDataEvent generateData(MyInParkingDataEvent myInParkingDataEvent) {
- myInParkingDataEvent.setCarLicense("车牌号: 鄂A-" + (int)(Math.random() * 100000)); // 随机生成一个车牌号
- System.out.println("Thread Id " + Thread.currentThread().getId() + " 写完一个event");
- return myInParkingDataEvent;
- }
- }
执行的Main方法:
- import com.lmax.disruptor.EventFactory;
- import com.lmax.disruptor.YieldingWaitStrategy;
- import com.lmax.disruptor.dsl.Disruptor;
- import com.lmax.disruptor.dsl.EventHandlerGroup;
- import com.lmax.disruptor.dsl.ProducerType;
- /**
- * 执行的Main方法 ,
- * 一个生产者(汽车进入停车场);
- * 三个消费者(一个记录汽车信息,一个发送消息给系统,一个发送消息告知司机)
- * 前两个消费者同步执行,都有结果了再执行第三个消费者
- */
- public class MyInParkingDataEventMain {
- public static void main(String[] args) {
- long beginTime=System.currentTimeMillis();
- int bufferSize = 2048; // 2的N次方
- try {
- // 创建线程池,负责处理Disruptor的四个消费者
- ExecutorService executor = Executors.newFixedThreadPool(4);
- // 初始化一个 Disruptor
- Disruptor<MyInParkingDataEvent> disruptor = new Disruptor<MyInParkingDataEvent>(new EventFactory<MyInParkingDataEvent>() {
- @Override
- public MyInParkingDataEvent newInstance() {
- return new MyInParkingDataEvent(); // Event 初始化工厂
- }
- }, bufferSize, executor, ProducerType.SINGLE, new YieldingWaitStrategy());
- // 使用disruptor创建消费者组 MyParkingDataInDbHandler 和 MyParkingDataToKafkaHandler
- EventHandlerGroup<MyInParkingDataEvent> handlerGroup = disruptor.handleEventsWith(
- new MyParkingDataInDbHandler(), new MyParkingDataToKafkaHandler());
- // 当上面两个消费者处理结束后在消耗 smsHandler
- MyParkingDataSmsHandler myParkingDataSmsHandler = new MyParkingDataSmsHandler();
- handlerGroup.then(myParkingDataSmsHandler);
- // 启动Disruptor
- disruptor.start();
- CountDownLatch countDownLatch = new CountDownLatch(1); // 一个生产者线程准备好了就可以通知主线程继续工作了
- // 生产者生成数据
- executor.submit(new MyInParkingDataEventPublisher(countDownLatch, disruptor));
- countDownLatch.await(); // 等待生产者结束
- disruptor.shutdown();
- executor.shutdown();
- } catch (Exception e) {
- e.printStackTrace();
- }
- System.out.println("总耗时:"+(System.currentTimeMillis()-beginTime));
- }
- }
--------------------- 本文来自 ITDragon龙 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_19558705/article/details/77247912?utm_source=copy
并发框架Disruptor场景应用的更多相关文章
- 无锁并发框架Disruptor学习入门
刚刚听说disruptor,大概理一下,只为方便自己理解,文末是一些自己认为比较好的博文,如果有需要的同学可以参考. 本文目标:快速了解Disruptor是什么,主要概念,怎么用 1.Disrupto ...
- 并发框架Disruptor译文
Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JVM平台上,其核心是一个业务逻辑 ...
- 并发框架Disruptor浅析
1.引言 Disruptor是一个开源的Java框架,它被设计用于在生产者—消费者(producer-consumer problem,简称PCP)问题上获得尽量高的吞吐量(TPS)和尽量低的延迟.D ...
- Java 并发框架Disruptor(七)
Disruptor VS BlockingQueue的压测对比: import java.util.concurrent.ArrayBlockingQueue; public class ArrayB ...
- Disruptor并发框架(一)简介&上手demo
框架简介 Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JVM平台上,其核心是一 ...
- 并发编程之Disruptor并发框架
一.什么是Disruptor Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JV ...
- Disruptor 并发框架
什么是Disruptor Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JVM平 ...
- Disruptor并发框架简介
Martin Fowler在自己网站上写一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金额交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JVM平台上,其核心是一个业务逻辑处 ...
- 来,带你鸟瞰 Java 中4款常用的并发框架!
1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库. 但是,当深入实现细节时,我们想起了一位智者曾经说过 ...
随机推荐
- CentOS 7 安装 JAVA环境(JDK 1.8)
1.打开url选择jdk1.8下载 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...
- Metal并行计算以及Metal程序的命令行编译
本来Cuda用的挺好,为了Apple,放弃Cuda,改投OpenCl.好不容易OpenCl也算熟悉了,WWDC2018又宣布了Metal2,建议大家放弃OpenCl,使用Metal Performan ...
- Java基础11:Java泛型详解
本文对java的泛型的概念和使用做了详尽的介绍. 本文参考https://blog.csdn.net/s10461/article/details/53941091 具体代码在我的GitHub中可以找 ...
- 重写equals的详细说明
返回目录 原文地址Java equals() 方法总结 equals() 超类 Object 中有这个 equals() 方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public b ...
- CPU的load和使用率傻傻分不清
1. 什么是Cpu的Load 使用uptime.top或者查看/proc/loadavg都可以看到CPU的load统计,这里有三个值,分别代表1分钟.5分钟和15分钟的CPU Load情况.大部分人认 ...
- 【ASP.NET Core快速入门】(五)命令行配置、Json文件配置、Bind读取配置到C#实例、在Core Mvc中使用Options
命令行配置 我们通过vs2017创建一个控制台项目CommandLineSample 可以看到现在项目以来的是dotnet core framework 我们需要吧asp.net core引用进来,我 ...
- DocX开源WORD操作组件的学习系列三
DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...
- 教你MySQL Binlog实用攻略
本文由云+社区发表 1.概述 binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的redo/undo log是完全不同的日志:其主要是用来记录对mysql数据更新或潜在发 ...
- [51nod1355] 斐波那契的最小公倍数
Description 给定 \(n\) 个正整数 \(a_1,a_2,...,a_n\),求 \(\text{lcm}(f_{a_1},f_{a_2},...,f_{a_n})\).其中 \(f_i ...
- webpack4.0各个击破(8)—— tapable篇
webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学习we ...