EventBus.java 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package com.its.common.event;
  2. import com.google.common.util.concurrent.ThreadFactoryBuilder;
  3. import lombok.extern.slf4j.Slf4j;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.Objects;
  7. import java.util.concurrent.*;
  8. @Slf4j
  9. public class EventBus {
  10. private static Map<Class<? extends Event>, List<EventHandler>> listenerMap = new ConcurrentHashMap<>();
  11. private static ThreadFactory sceneThreadFactory = new ThreadFactoryBuilder().setNameFormat("event-loop-%d").build();
  12. private static ExecutorService singleThreadSchedule = Executors.newSingleThreadScheduledExecutor(sceneThreadFactory);
  13. public static <E extends Event> void subscribe(Class<? extends Event> eventClass, EventHandler<E> eventHandler) {
  14. List<EventHandler> eventHandlerList = listenerMap.get(eventClass);
  15. if (null == eventHandlerList) {
  16. eventHandlerList = new CopyOnWriteArrayList<>();
  17. }
  18. eventHandlerList.add(eventHandler);
  19. listenerMap.put(eventClass,eventHandlerList);
  20. }
  21. public static <E extends Event> void publish(E event) {
  22. List<EventHandler> handlerList = listenerMap.get(event.getClass());
  23. if (!Objects.isNull(handlerList)) {
  24. for (EventHandler eventHandler: handlerList) {
  25. singleThreadSchedule.execute( () -> eventHandler.handle(event));
  26. }
  27. }
  28. }
  29. public static void close() throws Exception {
  30. listenerMap.clear();
  31. }
  32. }