Мы столкнулись с высокой ситуацией использования процессора, когда один из наших EventHandlers сломался.Disruptor park/halt несколько EventHandlers при возникновении исключения
Предположим, у нас есть несколько потребителей (EventHanlders
), которые настроены на последовательное выполнение над буфером. Если первый EventHandler выдает исключение, есть ли способ остановить (и просыпать их позже) все остальные EventHandlers.
То, что мы делаем, это положить провальную нить в сон и после того, как мы попытаемся снова использовать одно и то же событие. Но мы заметили, что другие потоки продолжают работать и пытаются читать из RingBuffer
даже там, где нет событий для чтения, что повышает процессор за приемлемыми уровнями.
На данный момент я отбрасываю, что это происходит потому, что WaitStrategy
disruptor
, потому что при нормальных условиях работает как ожидалось. Мы используем BlockingWaitStrategy
.
еще несколько объяснений ради примера
INPUT -> [A*] -> [B] -> [C] -> [D]
Где вход событие опрашиваться из RingBuffer
и А, В, С и D являются различными EventHandlers, которые выполняются последовательно. A * - потребитель, бросающий исключение.
Что мы хотим достичь, так это то, что когда потребитель A не может потреблять событие (например, после исключения), метод OnEvent (...) этого потребителя не выходит, но останется в цикле с регулярными снами пытаясь повторить то же самое событие, когда оно просыпается. Между тем все остальные потребители должны быть припаркованы или спать до тех пор, пока А не добьется успеха.
Мы используем версию disruptor 3.3.0.
Я работаю в Google, но не нашел рабочего решения.
Заранее спасибо.
Salva.