共计 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
正文完