|
@@ -0,0 +1,41 @@
|
|
|
|
|
+package com.its.common.event;
|
|
|
|
|
+
|
|
|
|
|
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+import java.util.Map;
|
|
|
|
|
+import java.util.Objects;
|
|
|
|
|
+import java.util.concurrent.*;
|
|
|
|
|
+
|
|
|
|
|
+@Slf4j
|
|
|
|
|
+public class EventBus {
|
|
|
|
|
+
|
|
|
|
|
+ private static Map<Class<? extends Event>, List<EventHandler>> listenerMap = new ConcurrentHashMap<>();
|
|
|
|
|
+ private static ThreadFactory sceneThreadFactory = new ThreadFactoryBuilder().setNameFormat("event-loop-%d").build();
|
|
|
|
|
+ private static ExecutorService singleThreadSchedule = Executors.newSingleThreadScheduledExecutor(sceneThreadFactory);
|
|
|
|
|
+
|
|
|
|
|
+ public static <E extends Event> void subscribe(Class<? extends Event> eventClass, EventHandler<E> eventHandler) {
|
|
|
|
|
+ List<EventHandler> eventHandlerList = listenerMap.get(eventClass);
|
|
|
|
|
+ if (null == eventHandlerList) {
|
|
|
|
|
+ eventHandlerList = new CopyOnWriteArrayList<>();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ eventHandlerList.add(eventHandler);
|
|
|
|
|
+ listenerMap.put(eventClass,eventHandlerList);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static <E extends Event> void publish(E event) {
|
|
|
|
|
+ List<EventHandler> handlerList = listenerMap.get(event.getClass());
|
|
|
|
|
+ if (!Objects.isNull(handlerList)) {
|
|
|
|
|
+ for (EventHandler eventHandler: handlerList) {
|
|
|
|
|
+ singleThreadSchedule.execute( () -> eventHandler.handle(event));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static void close() throws Exception {
|
|
|
|
|
+ listenerMap.clear();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+}
|