Disruptor один обработчик событий останавливает другие обработчики событий

Я запускаю экземпляр разрушителя со следующим обработчиком событий:

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 событие, потоки дисраптора работают последовательно?


person rupweb    schedule 30.07.2015    source источник
comment
Какой исполнитель сортировки вы использовали при создании экземпляра Disruptor?   -  person Sam Turtel Barker    schedule 04.08.2015
comment
@Сэм Тертел Баркер 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());   -  person rupweb    schedule 04.08.2015


Ответы (2)


Каждый EventHandler запускается в «потребительском» потоке, независимом от других потребительских потоков. Единственный случай, когда другие потоки-потребители могут быть затронуты (замедлены), — это когда один потребитель работает настолько медленно, что RingBuffer становится полным, что приводит к блокировке производителей, что, в свою очередь, влияет на потребителей. Код для потребителя поток (т. е. код, выполняющий EventHandler)

person Brimzi    schedule 31.07.2015

Хорошо, это была моя собственная ошибка. Я запускаю 2 набора разрушителей (один для стороны клиента и один для стороны провайдера), и мой код на стороне клиента был следующим:

disruptor.handleEventsWith(new Logger(), new Replicator()).then(new Logic());

в то время как мой код на стороне провайдера был следующим:

disruptor.handleEventsWith(new Logger(), new Replicator(), new Logic());

так что экземпляр разрушителя на стороне клиента делал то, что ему было сказано. Если репликатор блокируется, блокируется и логический поток.

Спасибо переполнению стека за то, что заставили меня снова проверить мой код.

person rupweb    schedule 04.08.2015