package com.alibaba.doris.dataserver.event; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import com.alibaba.doris.dataserver.event.config.ConfigEventListener; import com.alibaba.doris.dataserver.event.server.DataServerEventListener; import com.alibaba.doris.dataserver.event.server.MigrateEventListener; /** * 事件注册中心,为每种类型的事件都维护一个监听器队列,<br> * 在事件分发的过程中,不同类型的事件会转发给不同的事件监听队列。 * * @author ajun Email:jack.yuj@alibaba-inc.com */ public class EventRegistry { @SuppressWarnings("unchecked") public EventRegistry() { EventType[] typeArray = EventType.values(); listenerQueue = new List[typeArray.length]; for (EventType eventType : typeArray) { listenerQueue[eventType.ordinal()] = new CopyOnWriteArrayList<EventListener>(); } } public List<EventListener> getEventListenerRegistry(EventType eventType) { return listenerQueue[eventType.ordinal()]; } public void registEventListener(EventListener listener) { EventType eventType = null; if (listener instanceof DataServerEventListener) { eventType = EventType.DATA_SERVER_STATE; regist(eventType, listener); } if (listener instanceof ConfigEventListener) { eventType = EventType.CONFIG_CHANGED; regist(eventType, listener); } if (listener instanceof MigrateEventListener) { eventType = EventType.MIGRATE; regist(eventType, listener); } if (eventType == null) { throw new EventListnerException("You have registed an unknown EventListener.", null, listener); } } public void unregistEventListener(EventListener listener) { EventType eventType = null; if (listener instanceof DataServerEventListener) { eventType = EventType.DATA_SERVER_STATE; unregist(eventType, listener); } if (listener instanceof MigrateEventListener) { eventType = EventType.MIGRATE; unregist(eventType, listener); } if (listener instanceof ConfigEventListener) { eventType = EventType.CONFIG_CHANGED; unregist(eventType, listener); } if (eventType == null) { throw new EventListnerException("You have registed an unknown EventListener.", null, listener); } } private void regist(EventType eventType, EventListener listener) { listenerQueue[eventType.ordinal()].add(listener); } private void unregist(EventType eventType, EventListener listener) { List<EventListener> listenerList = listenerQueue[eventType.ordinal()]; Iterator<EventListener> itr = listenerList.iterator(); while (itr.hasNext()) { if (listener == itr.next()) { itr.remove(); break; } } } private List<EventListener>[] listenerQueue; }