Нарушитель один обработчик событий останавливает другие обработчики событий
Я запускаю экземпляр прерывателя со следующим обработчиком событий:
int NUM_EVENT_PROCESSORS = 5;
executor = Executors.newFixedThreadPool(NUM_EVENT_PROCESSORS);
EventFactory factory = new EventFactory();
System.out.println("Starting Disruptor");
disruptor = new Disruptor<>(factory, RING_SIZE, executor, ProducerType.SINGLE, new BlockingWaitStrategy());
disruptor.handleEventsWith(new Logger(), new Replicator(), new Logic());
disruptor.start();
Я обнаружил случай, когда поток Replicator() завис и заблокировал поток Logic().
Если в кольцевом буфере есть 1 событие, работают ли потоки прерывателя последовательно?
2 ответа
Хорошо, это была моя собственная ошибка. Я запускаю 2 набора прерывателей (один для стороны клиента и один для стороны поставщика), и мой код на стороне клиента был следующим:
disruptor.handleEventsWith(new Logger(), new Replicator()).then(new Logic());
в то время как код моего провайдера был следующим:
disruptor.handleEventsWith(new Logger(), new Replicator(), new Logic());
так что экземпляр нарушителя на стороне клиента делал, как было сказано. Если репликатор блокирует это, логический поток тоже.
Спасибо, переполнение стека за то, что заставил меня проверить мой код снова.
Каждый EventHandler запускается в "потребительском" потоке, независимом от других потребительских потоков. Единственный раз, когда другие потребительские потоки могут быть затронуты (замедлены), это когда один потребитель настолько медленный, что RingBuffer переполняется, что приводит к блокировке производителей, что, в свою очередь, влияет на потребителей. Код для потока потребителя (т.е. код, выполняющий EventHandler)