聊聊nacos-config的EventDispatcher

50次阅读

共计 2560 个字符,预计需要花费 7 分钟才能阅读完成。

本文主要研究一下 nacos config 的 EventDispatcher

EventDispatcher

nacos-1.1.3/config/src/main/java/com/alibaba/nacos/config/server/utils/event/EventDispatcher.java

public class EventDispatcher {
/**
* add event listener
*/
static public void addEventListener(AbstractEventListener listener) {for (Class<? extends Event> type : listener.interest()) {getEntry(type).listeners.addIfAbsent(listener);
}
}
/**
* fire event, notify listeners.
*/
static public void fireEvent(Event event) {if (null == event) {throw new IllegalArgumentException();
}
for (AbstractEventListener listener : getEntry(event.getClass()).listeners) {
try {listener.onEvent(event);
} catch (Exception e) {log.error(e.toString(), e);
}
}
}
/**
* For only test purpose
*/
static public void clear() {LISTENER_HUB.clear();
}
/**
* get event listener for eventType. Add Entry if not exist.
*/
static Entry getEntry(Class<? extends Event> eventType) {for (; ;) {for (Entry entry : LISTENER_HUB) {if (entry.eventType == eventType) {return entry;}
}
Entry tmp = new Entry(eventType);
/**
* false means already exists
*/
if (LISTENER_HUB.addIfAbsent(tmp)) {return tmp;}
}
}
//......
static private final Logger log = LoggerFactory.getLogger(EventDispatcher.class);
static final CopyOnWriteArrayList<Entry> LISTENER_HUB = new CopyOnWriteArrayList<Entry>();
public interface Event { }
//......
}
  • EventDispatcher 定义了 addEventListener、fireEvent、clear 方法;addEventListener 会添加 listener 到 Entry;fireEvent 会遍历指定 event 的 listener 然后回调其 onEvent 方法;clear 会清空整个 LISTENER_HUB

Entry

nacos-1.1.3/config/src/main/java/com/alibaba/nacos/config/server/utils/event/EventDispatcher.java

static private class Entry {
final Class<? extends Event> eventType;
final CopyOnWriteArrayList<AbstractEventListener> listeners;
Entry(Class<? extends Event> type) {
eventType = type;
listeners = new CopyOnWriteArrayList<AbstractEventListener>();}
@Override
public boolean equals(Object obj) {if (null == obj || obj.getClass() != getClass()) {return false;}
if (this == obj) {return true;}
return eventType == ((Entry)obj).eventType;
}
@Override
public int hashCode() {return super.hashCode();
}
}
  • Entry 有个 eventType 属性以及 AbstractEventListener 类型的 listener 集合

AbstractEventListener

nacos-1.1.3/config/src/main/java/com/alibaba/nacos/config/server/utils/event/EventDispatcher.java

static public abstract class AbstractEventListener {public AbstractEventListener() {
/**
* automatic register
*/
EventDispatcher.addEventListener(this);
}
/**
* 感兴趣的事件列表
*
* @return event list
*/
abstract public List<Class<? extends Event>> interest();
/**
* 处理事件
*
* @param event event
*/
abstract public void onEvent(Event event);
}
  • AbstractEventListener 定义了 interest、onEvent 方法

小结

EventDispatcher 定义了 addEventListener、fireEvent、clear 方法;addEventListener 会添加 listener 到 Entry;fireEvent 会遍历指定 event 的 listener 然后回调其 onEvent 方法;clear 会清空整个 LISTENER_HUB

doc

  • EventDispatcher

正文完
 0