2016-11-10 79 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

您是对的。我添加了一个更新的答案。 –