disruptor demo(三) 复杂一点的例子
来源:互联网 发布:手机制作mv软件 编辑:程序博客网 时间:2024/05/17 02:05
从中图可以看出需求是介样子的:生产者生产数据经过C1,C2处理完成后再到C3。
假设如下场景:
1、交易网关收到交易(P1)把交易数据发到RingBuffer中,
2、负责处理增值业务的消费者C1和负责数据存储的消费者C2负责处理交易
3、负责发送JMS消息的消费者C3在C1和C2处理完成后再进行处理。
1.
package p1;//POJO 交易类public class TradeTransaction {private String id; //交易IDprivate double price;//交易金额public TradeTransaction(){}public TradeTransaction(String id,double price){super();this.id = id;this.price = price;}public String getId() {return id;}public void setId(String id) {this.id = id;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}}
2.事件处理器(消费者)
package p1;import java.util.UUID;import com.lmax.disruptor.EventHandler;import com.lmax.disruptor.WorkHandler;public class TradeTransactionInDBHandler implements EventHandler<TradeTransaction>{@Overridepublic void onEvent(TradeTransaction event, long sequence, boolean endOfBatch) throws Exception {this.onEvent(event);}public void onEvent(TradeTransaction event) throws Exception {event.setId(UUID.randomUUID().toString());System.out.println(event.getId());}}
</pre><p></p><p><pre name="code" class="java">package p1;import com.lmax.disruptor.EventHandler;public class TradeTransactionVasConsumer implements EventHandler<TradeTransaction> {@Overridepublic void onEvent(TradeTransaction event, long sequence,boolean endOfBatch) throws Exception {//do something....}}
package p1;import com.lmax.disruptor.EventHandler;public class TradeTransactionJMSNotifyHandler implements EventHandler<TradeTransaction>{@Overridepublic void onEvent(TradeTransaction event, long sequence, boolean endOfBatch) throws Exception {}}
3.生产者
package p1;import java.util.Random;import com.lmax.disruptor.EventTranslator;public class TradeTransactionEventTranslator implements EventTranslator<TradeTransaction>{private Random random=new Random();@Overridepublic void translateTo(TradeTransaction event, long sequence) {this.generateTradeTransaction(event);}private TradeTransaction generateTradeTransaction(TradeTransaction trade){trade.setPrice(random.nextDouble()*9999);return trade;}}
package p1;import java.util.concurrent.CountDownLatch;import com.lmax.disruptor.dsl.Disruptor;public class TradeTransactionPublisher implements Runnable{Disruptor<TradeTransaction> disruptor;private CountDownLatch latch;private static int LOOP=10000000;//模拟一千万次交易的发生public TradeTransactionPublisher(CountDownLatch latch,Disruptor<TradeTransaction> disruptor){this.disruptor = disruptor;this.latch = latch;}@Overridepublic void run() {TradeTransactionEventTranslator tradeTransloator=new TradeTransactionEventTranslator();for(int i=0;i<LOOP;i++){disruptor.publishEvent(tradeTransloator);}latch.countDown();}}
4.demo类
package p1;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;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 Demo3 {public static void main(String[] args) throws Exception{long beginTime = System.currentTimeMillis();int bufferSize = 1024;ExecutorService executor=Executors.newFixedThreadPool(4);Disruptor<TradeTransaction> disruptor=new Disruptor<TradeTransaction>(new EventFactory<TradeTransaction>() {@Overridepublic TradeTransaction newInstance() {return new TradeTransaction();}}, bufferSize, executor, ProducerType.SINGLE, new BusySpinWaitStrategy());EventHandlerGroup<TradeTransaction> handlerGroup=disruptor.handleEventsWith(new TradeTransactionVasConsumer(),new TradeTransactionInDBHandler());TradeTransactionJMSNotifyHandler jmsConsumer=new TradeTransactionJMSNotifyHandler();//声明在C1,C2完事之后执行JMS消息发送操作 也就是流程走到C3handlerGroup.then(jmsConsumer);disruptor.start();CountDownLatch latch = new CountDownLatch(1);executor.submit(new TradeTransactionPublisher(latch, disruptor));latch.await();//等待生产者完事.disruptor.shutdown();executor.shutdown();System.out.println("总耗时:"+(System.currentTimeMillis()-beginTime));}
1 0
- disruptor demo(三) 复杂一点的例子
- disruptor demo(三) 复杂一点的例子
- Log4J学习【三】复杂一点的例子一
- Log4J学习【三】复杂一点的例子一
- 一个复杂一点的例子
- Log4J学习【四】复杂一点的例子二
- Log4J学习【四】复杂一点的例子二
- OpenCV入门(三)复杂一点的变换
- 复杂一点的变换
- 复杂一点的CV
- disruptor(三)
- 复杂例子的测试
- 一个复杂一点的变化
- moootools的demo例子
- 并发框架Disruptor几个Demo
- 并发框架Disruptor几个Demo
- 复杂的存储过程例子
- 一个复杂一点的单向链表
- hdu 1999-不可摸数
- 百依百顺导致无法无天?
- D3D trianglefan (三角形扇区) 小例子
- 8月7日晚-技术沙龙: HTML5/ WebGL 3D 模型浏览技术
- 在ubuntu12.04中安装wine和source insight
- disruptor demo(三) 复杂一点的例子
- Android数据存储方式(一)文件读写操作
- Spring中的ApplicationContextAware使用
- hdu 1058 Humble Numbers(DP)
- 完整性约束(章节摘要)
- 编译器的编译基本过程
- Python核心编程学习笔记-Python核心编程第七章
- 无序关联容器(C++11)
- <Android>两个布局之间的跳转