package cn.cloudwalk.event; import cn.cloudwalk.cwos.client.event.EventClient; import cn.cloudwalk.cwos.client.event.event.BaseEvent; import cn.cloudwalk.cwos.client.event.event.CustomEvent; import cn.cloudwalk.event.handler.CustomEventHandler; import cn.cloudwalk.event.handler.EventHandler; import cn.cloudwalk.event.handler.EventHandlerMapping; import cn.cloudwalk.event.handler.EventHandlerWorker; import cn.cloudwalk.event.listener.GroupEventListener; import cn.cloudwalk.event.listener.GroupListnerClassMapping; import cn.cloudwalk.event.task.EventHandleTask; import java.util.Collections; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; /** * 事件派发入口:基于 {@link cn.cloudwalk.event.handler.EventHandlerMapping} 选择处理器并委托 * {@link cn.cloudwalk.event.handler.EventHandlerWorker} 执行。 */ public class CloudwalkEventManager { private static final Logger LOGGER = LoggerFactory.getLogger(CloudwalkEventManager.class); private EventHandlerMapping eventHandlerMapping; private EventHandlerWorker eventHandlerWorker; private GroupListnerClassMapping groupListnerClassMapping; private EventClient eventClient; public void handle(Class eventListnerClass, BaseEvent baseEvent) { String groupId = this.groupListnerClassMapping.getGroupId(eventListnerClass); if (baseEvent instanceof CustomEvent) { Map> customByServiceCode = this.eventHandlerMapping .getServiceCodeCustomHandlerListMap(groupId, ((CustomEvent)baseEvent).getTopic()); if (customByServiceCode == null) { customByServiceCode = Collections.emptyMap(); } List customEventHandlers = (List)customByServiceCode.get(baseEvent.getServiceCode()); eventHandle(baseEvent, customEventHandlers); return; } Map> handlerByServiceCode = this.eventHandlerMapping.getServiceCodeHandlerListMap(groupId, baseEvent.getClass()); if (handlerByServiceCode == null) { handlerByServiceCode = Collections.emptyMap(); } List handlerList = (List)handlerByServiceCode.get(baseEvent.getServiceCode()); eventHandle(baseEvent, handlerList); } private void eventHandle(BaseEvent baseEvent, List handlers) { if (CollectionUtils.isEmpty(handlers)) { LOGGER.error("没有相应的事件处理程序"); return; } for (EventHandler eventHandler : handlers) { this.eventHandlerWorker.work(new EventHandleTask(baseEvent, eventHandler)); } } public void publish(BaseEvent baseEvent) { this.eventClient.pubEvent(baseEvent); } public void setEventHandlerMapping(EventHandlerMapping eventHandlerMapping) { this.eventHandlerMapping = eventHandlerMapping; } public EventHandlerMapping getEventHandlerMapping() { return this.eventHandlerMapping; } public void setEventHandlerWorker(EventHandlerWorker eventHandlerWorker) { this.eventHandlerWorker = eventHandlerWorker; } public void setEventClient(EventClient eventClient) { this.eventClient = eventClient; } public void setGroupListnerClassMapping(GroupListnerClassMapping groupListnerClassMapping) { this.groupListnerClassMapping = groupListnerClassMapping; } }