package message.event; import message.event.module.BaseEvent; import message.event.listener.AbstractEventListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.*; /** * 事件执行器. * * @author sunhao(sunhao.java@gmail.com) * @version V1.0 * @createTime 13-4-27 上午4:57 */ @Component public class EventExecutor { /** * Logger. */ private static final Logger logger = LoggerFactory.getLogger(EventExecutor.class); /** * 同步事件Map. */ private final Map<Class<? extends BaseEvent>, List<AbstractEventListener>> syncEventListeners = new HashMap<Class<? extends BaseEvent>, List<AbstractEventListener>>(); /** * 异步事件Map. */ private final Map<Class<? extends BaseEvent>, List<AbstractEventListener>> asyncEventListeners = new HashMap<Class<? extends BaseEvent>, List<AbstractEventListener>>(); private final Object REGISTER_LOCK_OBJECT = new Object(); /** * 注册监听服务 * * @param eventTypes 事件类型 * @param listener 监听器 * @param isSync 是否是同步执行 */ public void registerListener(List<Class<? extends BaseEvent>> eventTypes, AbstractEventListener listener, boolean isSync){ synchronized (REGISTER_LOCK_OBJECT) { if(eventTypes == null || eventTypes.isEmpty()){ logger.debug("module types is null!"); return; } logger.debug("regist listener '{}' for module type '{}'!", listener, eventTypes); Map<Class<? extends BaseEvent>, List<AbstractEventListener>> eventListeners = isSync ? syncEventListeners : asyncEventListeners; for(Iterator<Class<? extends BaseEvent>> it = eventTypes.iterator(); it.hasNext(); ){ Class<? extends BaseEvent> eventType = it.next(); if(eventType == null) continue; List<AbstractEventListener> listeners = eventListeners.get(eventType); if(listeners == null){ listeners = new ArrayList<AbstractEventListener>(); } listeners.add(listener); eventListeners.put(eventType, listeners); } } } /** * 执行事件 * * @param event */ public void executeEvent(BaseEvent event) throws BaseEventException { //1.先执行同步事件 List<AbstractEventListener> syncListeners = syncEventListeners.get(event.getClass()); if(syncListeners != null && !syncListeners.isEmpty()){ for(Iterator<AbstractEventListener> it = syncListeners.iterator(); it.hasNext(); ){ AbstractEventListener listener = it.next(); logger.debug("execute module '{}' use listener '{}'!", event, listener); //执行 try { listener.handleEvent(event); } catch (BaseEventException e) { logger.error(e.getMessage(), e); } } } //2.执行异步事件 List<AbstractEventListener> asyncListeners = asyncEventListeners.get(event.getClass()); if(asyncListeners != null && !asyncListeners.isEmpty()){ executeAsyncEvent(asyncListeners, event); } } /** * 执行异步事件 * * @param asyncListeners 异步事件监听 * @param event 异步事件 */ private void executeAsyncEvent(final List<AbstractEventListener> asyncListeners, final BaseEvent event) throws BaseEventException { new Thread(){ public void run() { for(Iterator<AbstractEventListener> it = asyncListeners.iterator(); it.hasNext(); ){ AbstractEventListener listener = it.next(); logger.debug("execute module '{}' use listener '{}'!", event, listener); //执行 try { listener.handleEvent(event); } catch (BaseEventException e) { logger.error(e.getMessage(), e); } } } }.start(); } }