前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊nacos config的EventDispatcher

聊聊nacos config的EventDispatcher

原创
作者头像
code4it
修改2019-09-09 11:28:17
8810
修改2019-09-09 11:28:17
举报
文章被收录于专栏:码匠的流水账码匠的流水账

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

EventDispatcher

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

代码语言:javascript
复制
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

代码语言:javascript
复制
    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

代码语言:javascript
复制
    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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • EventDispatcher
  • Entry
  • AbstractEventListener
  • 小结
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档