2015-02-03 2 views
0

Я нашел руководство пользователя для Lmax disrupter в github очень просто, теперь у меня проблема с одним производителем и пятью cosumer, после чего мне нужно заключить результат потребителя, есть ли демо-версия, как найти Lmax Разрушитель алмаза (один производитель 5 потребителей 1 заключить) пример?Как найти алмаз Lmax Disruptor (один производитель 5 потребителей 1)?

спасибо большое!

ответ

1

Вы можете предоставить нескольким потребителям через varags значение Disruptor.handleEventsWith. После этого зарегистрируйте вывод с вызовом then (плавный DSL). Второй вызов гарантирует, что события будут обработаны всеми потребителями перед передачей на заключительный шаг.

рабочего пример может выглядеть следующим образом:

import com.lmax.disruptor.*; 
import com.lmax.disruptor.dsl.*; 
import java.util.concurrent.*; 

public class Diamond { 

    public static void main(String[] args) { 
     ExecutorService executor = Executors.newCachedThreadPool(); 
     Disruptor<LongEvent> disruptor = new Disruptor<>(LongEvent::new, 1024, executor, ProducerType.SINGLE, new SleepingWaitStrategy()); 

     //register five consumers and a final conclude 
     disruptor.handleEventsWith(new Consumer(1), new Consumer(2), new Consumer(3), new Consumer(4), new Consumer(5)).then(new Conclude()); 

     disruptor.start(); 

     for (int i = 0; i < 3; i++) { 
      disruptor.publishEvent((event, sequence, newValue) -> event.setValue(newValue), i); 
     } 

     disruptor.shutdown(); 
     executor.shutdown(); 
    } 

    public static class Consumer implements EventHandler<LongEvent> { 
     private int i; 
     public Consumer(int i) { this.i = i; } 

     @Override 
     public void onEvent(LongEvent event, long sequence, boolean endOfBatch) throws Exception { 
      System.out.println("Consumer: " + i); 
      event.setValue(event.getValue() + 1); 
     } 
    } 

    public static class Conclude implements EventHandler<LongEvent> { 
     @Override 
     public void onEvent(LongEvent event, long sequence, boolean endOfBatch) throws Exception { 
      System.out.println("Conclude: " + event.getValue()); 
     } 
    } 

    public static class LongEvent 
    { 
     private long value; 

     public void setValue(long value) 
     { 
      this.value = value; 
     } 

     public long getValue() { 
      return this.value; 
     } 
    } 
} 

событие просто содержит длинное значение. Потребители увеличивают значение, последний шаг печатает его. Цикл for помещает три события с начальными значениями 1, 2 и 3 в кольцо.

Обратите внимание, что вам не нужно синхронизировать работу с LongEvent в Consumer, так как ringbuffer гарантирует, что только один обработчик работает над событием за один раз. Кроме того, обратите внимание на то, как отпечатки потребителей меняются на нескольких тиражах.