2016-11-10 80 views
1

我是一個破壞者的新手,我正在使用干擾程序在線程之間傳遞線程結構。我可以使用hadleEventsWith或使用after()來運行一組處理程序。Disruptor:設置EventHandler的順序

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

但是,我希望能夠以新的事件處理器添加到該管道在不改變代碼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

您是對的。我添加了一個更新的答案。 –