Тайм-аут прерывателя LMAX для EventHandler onEvent
У меня есть кольцевой буфер и обработчик событий. Это используется в качестве входящего буфера сервера обмена сообщениями.
Внутри моего чётного обработчика он выполняет некоторые вызовы службы AMQP, а иногда из-за того, что этот вызов ожидает без таймаута (ошибка в библиотеке протоколов подчеркивания, которая вызывает службы AMQP). И с 2000tps, это приводит мой кольцевой буфер размером 4096 к полному в мгновение ока. Потому что кажется, что вызывающий поток onEvent не возвращается из этого метода и ждет бесконечно внутри onEvent() из-за вышеупомянутого факта.
На данный момент создание тайм-аута для этого вызова не представляется возможным.
Вопрос::
Когда механизм прерывания вызывает onEvent(), можем ли мы установить тайм-аут на уровень создания буфера или какой-то другой уровень, где у него будет тайм-аут на вызов метода onEvent().
Я использую разрушитель 3.3.2 с BlockingWaitStrategy.
1 ответ
Разрушитель не поддерживает тайм-ауты на обработчиках событий. Однако я могу придумать несколько возможных способов обойти это.
Самым простым изменением будет завершение вашего проблемного вызова AMQP в будущем, на который вы звоните Future#get(timeout, TimeUnit)
,
Существуют и другие варианты отправки длительной задачи отдельному разрушителю для обработки или записи будущего в другое поле события, а также наличие второго события EventHandler.