Как найти пример алмаза Lmax Disruptor (один производитель 5, 1 потребитель)?

Я считаю, что руководство пользователя разрушителя Lmax в github очень простое, теперь у меня проблема с одним производителем и пятью потребителями, после чего мне нужно сделать вывод о результате для потребителя, есть ли какая-нибудь демонстрация, как найти бриллиант 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 поскольку кольцевой буфер гарантирует, что только один обработчик одновременно работает с событием. Кроме того, обратите внимание, как отпечатки потребителей меняются на несколько прогонов.

Другие вопросы по тегам