多场景玩法
import java.util.Random; 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.EventHandler; import com.lmax.disruptor.EventTranslator; import com.lmax.disruptor.WorkHandler; import com.lmax.disruptor.dsl.Disruptor; import com.lmax.disruptor.dsl.ProducerType;
/** * 多场景玩法 */ public class D03MultiScenario { public static void main(String[] args) throws InterruptedException {
long start = System.currentTimeMillis();
//线程池 ExecutorService pool = Executors.newFixedThreadPool(5);
//Disruptor Disruptor<MData> disruptor = new Disruptor<MData>(new EventFactory<MData>() { @Override public MData newInstance() { return new MData(); } }, 1024, pool,ProducerType.SINGLE,new BusySpinWaitStrategy());
/* * P生产数据,C1、C2执行完,才到C3执行 * /C1\ * P C3 * \C2/ */ // EventHandlerGroup<MData> handleEventsWith = disruptor.handleEventsWith(new MDataConsumer1(),new MDataConsumer2()); // handleEventsWith.then(new MDataConsumer3());
//顺序操作 // disruptor.handleEventsWith(new MDataConsumer1()). // handleEventsWith(new MDataConsumer2()). // handleEventsWith(new MDataConsumer3());
/* * /C1 -> C4\ * P C3 * \C2 -> C5/ */ // MDataConsumer1 mDataConsumer1 = new MDataConsumer1(); // MDataConsumer2 mDataConsumer2 = new MDataConsumer2(); // MDataConsumer3 mDataConsumer3 = new MDataConsumer3(); // MDataConsumer4 mDataConsumer4 = new MDataConsumer4(); // MDataConsumer5 mDataConsumer5 = new MDataConsumer5(); // disruptor.handleEventsWith(mDataConsumer1,mDataConsumer2); // disruptor.after(mDataConsumer1).handleEventsWith(mDataConsumer4); // disruptor.after(mDataConsumer2).handleEventsWith(mDataConsumer5); // disruptor.after(mDataConsumer4,mDataConsumer5).handleEventsWith(mDataConsumer3);
//启动 disruptor.start();
CountDownLatch countDownLatch = new CountDownLatch(1);
//生产者 pool.submit(new MDataProducer(disruptor,countDownLatch));
//等待生产者完事 countDownLatch.await();
disruptor.shutdown(); pool.shutdown(); System.out.println("耗时:" + (System.currentTimeMillis() - start)); } } /** * 数据 */ class MData { private int id; private String value;
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getValue() { return value; }
public void setValue(String value) { this.value = value; } } /** * 生产者 */ class MDataProducer implements Runnable {
private Disruptor<MData> disruptor; private CountDownLatch countDownLatch;
public MDataProducer(Disruptor<MData> disruptor, CountDownLatch countDownLatch) { super(); this.disruptor = disruptor; this.countDownLatch = countDownLatch; }
@Override public void run() { //模拟百万次订单交易 for (int i = 0; i < 3; i++) { disruptor.publishEvent(new EventTranslator<MData>() { @Override public void translateTo(MData data, long nextSeq) { data.setValue("MDataProducer - Pushlish..."); } }); } countDownLatch.countDown(); } } /** * 消费者1 */ class MDataConsumer1 implements EventHandler<MData>,WorkHandler<MData> { @Override public void onEvent(MData data, long arg1, boolean arg2) throws Exception { onEvent(data); }
@Override public void onEvent(MData data) throws Exception { System.out.println("MDataConsumer-1 - setId:" + data.getValue()); data.setId(new Random().nextInt()); // Thread.sleep(1000); } } /** * 消费者2 */ class MDataConsumer2 implements EventHandler<MData>,WorkHandler<MData> { @Override public void onEvent(MData data, long arg1, boolean arg2) throws Exception { onEvent(data); }
@Override public void onEvent(MData data) throws Exception { System.out.println("MDataConsumer-2 - setValue:" + data.getValue()); data.setValue("C2"); Thread.sleep(1000); } } /** * 消费者3 */ class MDataConsumer3 implements EventHandler<MData> { @Override public void onEvent(MData data, long nextSeq, boolean endOfBatch) throws Exception { System.out.println("MDataConsumer-3:" + data.getId() + " - " + data.getValue() + " - " + data); data.setValue("C3"); } } /** * 消费者4 */ class MDataConsumer4 implements EventHandler<MData>,WorkHandler<MData> { @Override public void onEvent(MData data, long arg1, boolean arg2) throws Exception { onEvent(data); } @Override public void onEvent(MData data) throws Exception { System.out.println("MDataConsumer-4:" + data.getId() + " - " + data.getValue() + " - " + data); data.setValue("C4"); } } /** * 消费者5 */ class MDataConsumer5 implements EventHandler<MData>,WorkHandler<MData> { @Override public void onEvent(MData data, long arg1, boolean arg2) throws Exception { onEvent(data); } @Override public void onEvent(MData data) throws Exception { System.out.println("MDataConsumer-5:" + data.getId() + " - " + data.getValue() + " - " + data); data.setValue("C5"); } } |
多消费者多生产者玩法
import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer;
import com.lmax.disruptor.EventFactory; import com.lmax.disruptor.ExceptionHandler; import com.lmax.disruptor.RingBuffer; import com.lmax.disruptor.SequenceBarrier; import com.lmax.disruptor.WorkHandler; import com.lmax.disruptor.WorkerPool; import com.lmax.disruptor.YieldingWaitStrategy; import com.lmax.disruptor.dsl.ProducerType;
/** * 多生产者、多消费者 */ public class D05MultiPWithC { public static void main(String[] args) throws InterruptedException { //创建RingBuffer RingBuffer<Order> ringBuffer = RingBuffer.create(ProducerType.MULTI, new EventFactory<Order>() { @Override public Order newInstance() { return new Order(); } }, 1024 * 1024, new YieldingWaitStrategy());
SequenceBarrier newBarrier = ringBuffer.newBarrier();
//消费者 OConsumer [] oConsumers = new OConsumer[3]; for (int i = 0; i < oConsumers.length; i++) { oConsumers[i] = new OConsumer(i + 10); }
//消息处理器 WorkerPool<Order> workerPool = new WorkerPool<>(ringBuffer, newBarrier, new MyEventExceptionHandler(),oConsumers);
//把消费者的位置信息引入注入到生产者,让生产者可以根据消费者的情况决定生产的速度,避免一个快、一个慢,如果只有一个消费者的情况可以省略 ringBuffer.addGatingSequences(workerPool.getWorkerSequences()); workerPool.start(Executors.newFixedThreadPool(5));
CountDownLatch countDownLatch = new CountDownLatch(1);
for (int i = 0; i < 3; i++) { OProducer oProducer = new OProducer(ringBuffer); new Thread(new Runnable() { @Override public void run() { try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } for (int j = 0; j < 3; j++) { oProducer.publish(j); } } }).start(); } Thread.sleep(3000); System.out.println("生产完毕"); countDownLatch.countDown(); Thread.sleep(5000); System.out.println("总:" + oConsumers[0].getCount().get()); } } class Order { private int id;
public int getId() { return id; }
public void setId(int id) { this.id = id; } } /** * 生产者 */ class OProducer {
private RingBuffer<Order> ringBuffer;
public OProducer(RingBuffer<Order> ringBuffer) { super(); this.ringBuffer = ringBuffer; }
public void publish(int id) { //槽位置 long nextSeq = ringBuffer.next(); try { Order order = ringBuffer.get(nextSeq); order.setId(id); } finally { //发布数据 ringBuffer.publish(nextSeq); } } } /** * 消费者 */ class OConsumer implements WorkHandler<Order> {
private int consumerId;
private static AtomicInteger count = new AtomicInteger();
public OConsumer(int consumerId) { super(); this.consumerId = consumerId; }
@Override public void onEvent(Order order) throws Exception { System.out.println("消费者:" + this.consumerId + " - 数据:" + order.getId()); count.incrementAndGet(); }
public static AtomicInteger getCount() { return count; } } /** * 异常处理 */ class MyEventExceptionHandler implements ExceptionHandler {
@Override public void handleEventException(Throwable arg0, long arg1, Object arg2) { }
@Override public void handleOnShutdownException(Throwable arg0) { }
@Override public void handleOnStartException(Throwable arg0) { } } |