先c1和c2并行消费生产者产生的数据,然后c3再消费该数据

我们来使用代码实现:我们可以使用Disruptor实例来实现,也可以不用产生Disruptor实例,直接调用RingBuffer的api来实现,不清楚看上一节使用的api函数workpool和BatchEventProcess来辅助实现消费者

上面需要使用的场景很复杂,只能使用Disruptor实例来实现线程通信,简单场景就直接使用RingBuffer就可以了

我们来看下程序的代码:

案例一:

package bhz.generate2;

import java.util.UUID;

import bhz.generate1.Trade;

import com.lmax.disruptor.EventHandler;
import com.lmax.disruptor.WorkHandler; public class Handler1 implements EventHandler<Trade>,WorkHandler<Trade> { @Override
public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
this.onEvent(event);
} @Override
public void onEvent(Trade event) throws Exception {
System.out.println("handler1: set name");
event.setName("h1");
Thread.sleep(1000);
}
}
package bhz.generate2;

import bhz.generate1.Trade;

import com.lmax.disruptor.EventHandler;

public class Handler2 implements EventHandler<Trade> {  

    @Override
public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
System.out.println("handler2: set price");
event.setPrice(17.0);
Thread.sleep(1000);
} }
package bhz.generate2;

import bhz.generate1.Trade;

import com.lmax.disruptor.EventHandler;

public class Handler3 implements EventHandler<Trade> {
@Override
public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
System.out.println("handler3: name: " + event.getName() + " , price: " + event.getPrice() + "; instance: " + event.toString());
}
}

我们来看下主函数

package bhz.generate2;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import bhz.generate1.Trade;
import bhz.generate1.TradeHandler; import com.lmax.disruptor.BusySpinWaitStrategy;
import com.lmax.disruptor.EventFactory;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.dsl.EventHandlerGroup;
import com.lmax.disruptor.dsl.ProducerType; public class Main {
public static void main(String[] args) throws InterruptedException { long beginTime=System.currentTimeMillis();
int bufferSize=1024;
ExecutorService executor=Executors.newFixedThreadPool(8); Disruptor<Trade> disruptor = new Disruptor<Trade>(new EventFactory<Trade>() {
@Override
public Trade newInstance() {
return new Trade();
}
}, bufferSize, executor, ProducerType.SINGLE, new BusySpinWaitStrategy()); //菱形操作
//使用disruptor创建消费者组C1,C2
EventHandlerGroup<Trade> handlerGroup =
disruptor.handleEventsWith(new Handler1(), new Handler2());
//声明在C1,C2完事之后执行JMS消息发送操作 也就是流程走到C3
handlerGroup.then(new Handler3()); //顺序操作
/**
disruptor.handleEventsWith(new Handler1()).
handleEventsWith(new Handler2()).
handleEventsWith(new Handler3());
*/ //六边形操作.
/**
Handler1 h1 = new Handler1();
Handler2 h2 = new Handler2();
Handler3 h3 = new Handler3();
Handler4 h4 = new Handler4();
Handler5 h5 = new Handler5();
disruptor.handleEventsWith(h1, h2);
disruptor.after(h1).handleEventsWith(h4);
disruptor.after(h2).handleEventsWith(h5);
disruptor.after(h4, h5).handleEventsWith(h3);
*/ disruptor.start();//启动
CountDownLatch latch=new CountDownLatch(1);
//生产者准备
executor.submit(new TradePublisher(latch, disruptor)); latch.await();//等待生产者完事. disruptor.shutdown();
executor.shutdown();
System.out.println("总耗时:"+(System.currentTimeMillis()-beginTime));
}
} 生产者的代码:
package bhz.generate2;

import java.util.Random;
import java.util.concurrent.CountDownLatch; import bhz.generate1.Trade; import com.lmax.disruptor.EventTranslator;
import com.lmax.disruptor.dsl.Disruptor; public class TradePublisher implements Runnable { Disruptor<Trade> disruptor;
private CountDownLatch latch; private static int LOOP=10;//模拟百万次交易的发生 public TradePublisher(CountDownLatch latch,Disruptor<Trade> disruptor) {
this.disruptor=disruptor;
this.latch=latch;
} @Override
public void run() {
TradeEventTranslator tradeTransloator = new TradeEventTranslator();
for(int i=0;i<LOOP;i++){
disruptor.publishEvent(tradeTransloator);
}
latch.countDown();
} } class TradeEventTranslator implements EventTranslator<Trade>{ private Random random=new Random(); @Override
public void translateTo(Trade event, long sequence) {
this.generateTrade(event);
} private Trade generateTrade(Trade trade){
trade.setPrice(random.nextDouble()*9999);
return trade;
} }

hanlde1设置name,handle2设置价格,hanle3将名字和价格打印出来

我们来看下程序运行的代码:
 

handler2: set price
handler1: set name
handler2: set price
handler1: set name
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@2aa2f9e6
handler2: set price
handler1: set name
handler2: set price
handler1: set name
handler1: set name
handler2: set price
handler1: set name
handler2: set price
handler2: set price
handler1: set name
handler2: set price
handler1: set name
handler1: set name
handler2: set price
handler1: set name
handler2: set price
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@7d6c848f
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@5f73089d
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@793aac5f
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@7b0acf26
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@2a606e6
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@620ee765
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@4079ca2e
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@7bc8b313
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@3564e3e2
总耗时:10027

上面对应一个生产者,三个消费者,一个生产者提交了10个任务,上面每一个hashcode都是不同的

上面这种模式是一个生产者,多个消费者的情况

场景2:


我们来看下程序的代码:

package bhz.generate2;

import java.util.UUID;

import bhz.generate1.Trade;

import com.lmax.disruptor.EventHandler;
import com.lmax.disruptor.WorkHandler; public class Handler4 implements EventHandler<Trade>,WorkHandler<Trade> { @Override
public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
this.onEvent(event);
} @Override
public void onEvent(Trade event) throws Exception {
System.out.println("handler4: get name : " + event.getName());
event.setName(event.getName() + "h4");
}
}
package bhz.generate2;

import java.util.UUID;

import bhz.generate1.Trade;

import com.lmax.disruptor.EventHandler;
import com.lmax.disruptor.WorkHandler; public class Handler5 implements EventHandler<Trade>,WorkHandler<Trade> { @Override
public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
this.onEvent(event);
} @Override
public void onEvent(Trade event) throws Exception {
System.out.println("handler5: get price : " + event.getPrice());
event.setPrice(event.getPrice() + 3.0);
}
}

主函数:

package bhz.generate2;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import bhz.generate1.Trade;
import bhz.generate1.TradeHandler; import com.lmax.disruptor.BusySpinWaitStrategy;
import com.lmax.disruptor.EventFactory;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.dsl.EventHandlerGroup;
import com.lmax.disruptor.dsl.ProducerType; public class Main {
public static void main(String[] args) throws InterruptedException { long beginTime=System.currentTimeMillis();
int bufferSize=1024;
ExecutorService executor=Executors.newFixedThreadPool(8); Disruptor<Trade> disruptor = new Disruptor<Trade>(new EventFactory<Trade>() {
@Override
public Trade newInstance() {
return new Trade();
}
}, bufferSize, executor, ProducerType.SINGLE, new BusySpinWaitStrategy()); /* //菱形操作
//使用disruptor创建消费者组C1,C2
EventHandlerGroup<Trade> handlerGroup =
disruptor.handleEventsWith(new Handler1(), new Handler2());
//声明在C1,C2完事之后执行JMS消息发送操作 也就是流程走到C3
handlerGroup.then(new Handler3());*/ //顺序操作
/**
disruptor.handleEventsWith(new Handler1()).
handleEventsWith(new Handler2()).
handleEventsWith(new Handler3());
*/ //六边形操作. Handler1 h1 = new Handler1();
Handler2 h2 = new Handler2();
Handler3 h3 = new Handler3();
Handler4 h4 = new Handler4();
Handler5 h5 = new Handler5();
disruptor.handleEventsWith(h1, h2);
disruptor.after(h1).handleEventsWith(h4);
disruptor.after(h2).handleEventsWith(h5);
disruptor.after(h4, h5).handleEventsWith(h3); disruptor.start();//启动
CountDownLatch latch=new CountDownLatch(1);
//生产者准备
executor.submit(new TradePublisher(latch, disruptor)); latch.await();//等待生产者完事. disruptor.shutdown();
executor.shutdown();
System.out.println("总耗时:"+(System.currentTimeMillis()-beginTime));
}
}

程序运行的效果:

handler2: set price
handler1: set name
handler2: set price
handler1: set name
handler2: set price
handler1: set name
handler2: set price
handler1: set name
handler1: set name
handler2: set price
handler1: set name
handler2: set price
handler1: set name
handler2: set price
handler1: set name
handler2: set price
handler1: set name
handler2: set price
handler2: set price
handler1: set name
handler5: get price : 17.0
handler5: get price : 17.0
handler5: get price : 17.0
handler5: get price : 17.0
handler5: get price : 17.0
handler5: get price : 17.0
handler5: get price : 17.0
handler5: get price : 17.0
handler5: get price : 17.0
handler5: get price : 17.0
handler4: get name : h1
handler4: get name : h1
handler4: get name : h1
handler4: get name : h1
handler4: get name : h1
handler4: get name : h1
handler4: get name : h1
handler4: get name : h1
handler4: get name : h1
handler4: get name : h1
handler3: name: h1h4 , price: 20.0; instance: bhz.generate1.Trade@2f30e44c
handler3: name: h1h4 , price: 20.0; instance: bhz.generate1.Trade@32dc51c8
handler3: name: h1h4 , price: 20.0; instance: bhz.generate1.Trade@1e7d3b8e
handler3: name: h1h4 , price: 20.0; instance: bhz.generate1.Trade@2fd0f745
handler3: name: h1h4 , price: 20.0; instance: bhz.generate1.Trade@4019eb89
handler3: name: h1h4 , price: 20.0; instance: bhz.generate1.Trade@65b6903f
handler3: name: h1h4 , price: 20.0; instance: bhz.generate1.Trade@34b84c44
handler3: name: h1h4 , price: 20.0; instance: bhz.generate1.Trade@2f971f66
handler3: name: h1h4 , price: 20.0; instance: bhz.generate1.Trade@6a8e79f2
handler3: name: h1h4 , price: 20.0; instance: bhz.generate1.Trade@2fe83585
总耗时:10368

3、案例三:如何实现按顺利操作了,c1执行完了执行c2,c2执行完了执行c3

package bhz.generate2;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import bhz.generate1.Trade;
import bhz.generate1.TradeHandler; import com.lmax.disruptor.BusySpinWaitStrategy;
import com.lmax.disruptor.EventFactory;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.dsl.EventHandlerGroup;
import com.lmax.disruptor.dsl.ProducerType; public class Main {
public static void main(String[] args) throws InterruptedException { long beginTime=System.currentTimeMillis();
int bufferSize=1024;
ExecutorService executor=Executors.newFixedThreadPool(8); Disruptor<Trade> disruptor = new Disruptor<Trade>(new EventFactory<Trade>() {
@Override
public Trade newInstance() {
return new Trade();
}
}, bufferSize, executor, ProducerType.SINGLE, new BusySpinWaitStrategy()); /* //菱形操作
//使用disruptor创建消费者组C1,C2
EventHandlerGroup<Trade> handlerGroup =
disruptor.handleEventsWith(new Handler1(), new Handler2());
//声明在C1,C2完事之后执行JMS消息发送操作 也就是流程走到C3
handlerGroup.then(new Handler3());*/ //顺序操作
disruptor.handleEventsWith(new Handler1()).
handleEventsWith(new Handler2()).
handleEventsWith(new Handler3()); //六边形操作.
/*
Handler1 h1 = new Handler1();
Handler2 h2 = new Handler2();
Handler3 h3 = new Handler3();
Handler4 h4 = new Handler4();
Handler5 h5 = new Handler5();
disruptor.handleEventsWith(h1, h2);
disruptor.after(h1).handleEventsWith(h4);
disruptor.after(h2).handleEventsWith(h5);
disruptor.after(h4, h5).handleEventsWith(h3);*/ disruptor.start();//启动
CountDownLatch latch=new CountDownLatch(1);
//生产者准备
executor.submit(new TradePublisher(latch, disruptor)); latch.await();//等待生产者完事. disruptor.shutdown();
executor.shutdown();
System.out.println("总耗时:"+(System.currentTimeMillis()-beginTime));
}
}

执行执行的效果如下所示:

handler1: set name
handler1: set name
handler1: set name
handler1: set name
handler1: set name
handler1: set name
handler1: set name
handler1: set name
handler1: set name
handler1: set name
handler2: set price
handler2: set price
handler2: set price
handler2: set price
handler2: set price
handler2: set price
handler2: set price
handler2: set price
handler2: set price
handler2: set price
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@51532e9f
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@2c19f26f
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@5b7b6c07
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@3f16e7d
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@5f8cd290
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@16541cf2
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@6c385f51
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@68f9f658
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@729c413f
handler3: name: h1 , price: 17.0; instance: bhz.generate1.Trade@707fc9e1
总耗时:20049

disruptor架构三 使用场景更加复杂的场景的更多相关文章

  1. disruptor架构三 使用场景 使用WorkHandler和BatchEventProcessor辅助创建消费者

    在helloWorld的实例中,我们创建Disruptor实例,然后调用getRingBuffer方法去获取RingBuffer,其实在很多时候,我们可以直接使用RingBuffer,以及其他的API ...

  2. 朱晔的互联网架构实践心得S1E2:屡试不爽的架构三马车

    朱晔的互联网架构实践心得S1E2:屡试不爽的架构三马车 [下载本文PDF进行阅读] 这里所说的三架马车是指微服务.消息队列和定时任务.如下图所示,这里是一个三驾马车共同驱动的一个立体的互联网项目的架构 ...

  3. loadrunner笔记(三):设置、运行场景和生成测试报告

    //上一篇的代码有点问题,问题出在 web_reg_find()函数中,这个函数简单的说是搜索下一步操作的请求对象(html)页面中是否存在相应的文本字符串.所以用在登录操作中,它搜索的是主页.htm ...

  4. storyboard三种sugue 和 跳转场景的三种方式 以及控制器之间的传值

    Storyboard引入了2个概念:1. scene:一个场景,由一个viewController和相关的xib表示. 2. segue:在这是用于连接scenes,其有多种类型,iphone包括:P ...

  5. 大型网站技术架构(四)--核心架构要素 开启mac上印象笔记的代码块 大型网站技术架构(三)--架构模式 JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)

    大型网站技术架构(四)--核心架构要素   作者:13GitHub:https://github.com/ZHENFENG13版权声明:本文为原创文章,未经允许不得转载.此篇已收录至<大型网站技 ...

  6. loadrunner 运行场景-命令行运行场景

    运行场景-命令行运行场景 by:授客 QQ:1033553122 1 相对路径与绝对路径 在场景中为脚本指定一个相对位置,可以是相对于当前场景目录或lr安装目录. 当你运行一个场景,场景自动从这个相对 ...

  7. Cocos2d-x如何添加新场景及切换新场景(包括场景特效)

    做了一天多的工作终于把此功能搞定了,实际上添加新场景花费不了多少时间,时间主要花在切换到另一个场景的实现上,主要原因是编译时出现了一个错误,百思不得其解,后来经过查资料不断摸索才知道自己问题的所在,改 ...

  8. LNMP架构三

    Nginx代理(正向代理) 正向代理:让局域网内的用户 访问外网,外网不能访问局域网, 场景:如果要从国内访问美国的服务器会很慢,这时候就可以找个香港服务器做代理,香港访问美国是很快的. 代理服务器作 ...

  9. iOS 应用架构 (三)

    iOS 客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答 iOS 应用架构中的种种问题,本文是其中的第二篇,主要讲 View 层的组织和调用方案.下篇主要讨论做 Vi ...

随机推荐

  1. DataFrame-选择与切片

    取得DataFrame对象reviews的description列的前10个值(或者说reviews前10行的description列): reviews.iloc[:10].loc[:,'descr ...

  2. 一篇文章看清楚 Linux 的职业发展方向

    手机.汽车.甚至宇宙飞船,在今天的科技世界中,你几乎到处都能看到 Linux 的身影.前两天 SpaceX 成功将宇航员送入太空的猎鹰9号火箭与龙飞船用的也是 Linux的操作系统.身处与 Linux ...

  3. python数据类型 列表+元组

    一:列表 二:元组 一:列表list: 1.列表中的每个元素都可变的,意味着可以对每个元素进行修改和删除: 2.列表是有序的,每个元素的位置是确定的,可以用索引去访问每个元素: 3.列表的所有元素放在 ...

  4. flex布局以及常用属性。

    (1)flex布局排列 会消除块状属性,所有与块状相关的属性将失效,比如块状元素会独占一行,如图2,设置flex后会在一行排列

  5. 第九届蓝桥杯JavaC组决(国)赛真题

    1:年龄问题 s夫人一向很神秘.这会儿有人问起她的年龄,她想了想说: "20年前,我丈夫的年龄刚好是我的2倍,而现在他的年龄刚好是我的1.5倍". 你能算出s夫人现在的年龄吗? 这 ...

  6. Java实现 LeetCode 714 买卖股票的最佳时机含手续费(动态规划 || 迭代法)

    714. 买卖股票的最佳时机含手续费 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :非负整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你每次交 ...

  7. Java实现 LeetCode 503 下一个更大元素 II

    503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...

  8. Java实现 LeetCode 35 搜索插入位置

    35. 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1, ...

  9. java实现顺时针螺旋填入

    从键盘输入一个整数(1~20) 则以该数字为矩阵的大小,把 1,2,3-n*n 的数字按照顺时针螺旋的形式填入其中.例如: 输入数字 2,则程序输出: 1 2 4 3 输入数字 3,则程序输出: 1 ...

  10. vi命令总结

    VI常用技巧 ​ VI命令可以说是Unix/Linux世界里最常用的编辑文件的命令了,但是因为它的命令集众多,很多人都不习惯使用它,其实您只需要掌握基本命令,然后加以灵活运用,就会发现它的优势,并会逐 ...