聊聊nacos-config的EventDispatcher

6次阅读

共计 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