2016-11-10 4 views
1

Я новичок для разрушителя, и я использую прерыватель для передачи между потоками в конвейерной структуре. Я могу запустить набор обработчиков, как показано ниже, с помощью hasleEventsWith или с помощью функции after().Disruptor: установка EventHandler order

disruptor.handleEventsWith(eventhandler1) 
       .then(eventhandler2) 
       .then(eventhandler3); 

Но я хочу, чтобы иметь возможность добавлять новые EventHandlers к этому трубопроводу, не меняя код here.To сделать это, я добавляю целое значение для каждого события handler.Then, я беру эти ценности и соответствующие обработчики для создания упорядоченного списка обработчиков. Затем, чтобы дать заказ на разрушающее то, что я сейчас делаю это

disruptor.handleEventsWith(handlerOrderList.get(0)); 
for (int i=1; i<handlerOrderList.size();i++) { 
    disruptor.after(handlerOrderList.get(i1)).then(handlerOrderList.get(i)); 
} 

Есть ли лучший способ сделать это?

ответ

2

Нечто подобное могло бы быть гораздо более удобным для чтения:

EventHandler<YourTypeHere>[] handlers = getOrderedHandlersAsArray(); 
    disruptor.handleEventsWith(handlers); 

UPDATE: Вы правы. В приведенном выше случае обработчики будут обрабатывать события параллельно. Для обработки событий последовательно, вы можете попробовать что-то вроде следующего:

EventHandlerGroup<T> eventHandlerGroup = null; 
    for (T handler : handlers) { 
     if (eventHandlerGroup == null) { 
      eventHandlerGroup = disruptor.handleEventsWith(handler); 
     } else { 
      eventHandlerGroup.then(handler); 
     } 
    } 
+0

, но с этим, обработчики событий не работают в правильном порядке – Gimhani

+0

Вы правы. Я добавил обновление ответа. –