在复杂场景下使用RingBuffer
(希望P1生产的数据给C1、C2并行执行,最后C1、C2执行结束后C3执行)
菱形
六边形
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());
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();
// Thread.sleep(10);
disruptor.shutdown();
executor.shutdown();
System.out.println("总耗时:"+(System.currentTimeMillis()-beginTime));
}
}
TradeHandler类
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 tradeTranslator = new TradeEventTranslator();
for(int i=0;i<LOOP;i++){
disruptor.publishEvent(tradeTranslator);
}
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;
}
}
Handler1类
public class Handler1 implements EventHandler<Trade> ,WorkHandler<Trade>{
@Override
public void onEvent(Trade event) throws Exception {
this.onEvent(event);
}
@Override
public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
System.out.println("handler1: set name");
event.setName("h1");
// Thread.sleep(1000);
}
}
Handler2类
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);
}
}
Handler3类
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());
}
}
Handler4类
public class Handler4 implements EventHandler<Trade>,WorkHandler<Trade>{
@Override
public void onEvent(Trade event) throws Exception {
this.onEvent(event);
}
@Override
public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
System.out.println("Handler4: getName :"+event.getName());
event.setName(event.getName()+"h4");
}
}
Handler5类
public class Handler5 implements EventHandler<Trade>,WorkHandler<Trade>{
@Override
public void onEvent(Trade event) throws Exception {
this.onEvent(event);
}
@Override
public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
System.out.println("Handler5 : getPrice :"+event.getPrice());
event.setPrice(event.getPrice()+3.0);
}
}