Parcourir la source

add event bus

zhouhao il y a 7 ans
Parent
commit
1791261561
15 fichiers modifiés avec 263 ajouts et 0 suppressions
  1. 15 0
      hsweb-eventbus/hsweb-eventbus-api/pom.xml
  2. 9 0
      hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventBus.java
  3. 9 0
      hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventListener.java
  4. 9 0
      hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventPublisher.java
  5. 12 0
      hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventSubscriber.java
  6. 12 0
      hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/annotation/EventMode.java
  7. 20 0
      hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/annotation/Subscribe.java
  8. 29 0
      hsweb-eventbus/hsweb-eventbus-default/pom.xml
  9. 57 0
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/DefaultEventBus.java
  10. 22 0
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/DefaultEventPublisher.java
  11. 12 0
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/EventListenerContainer.java
  12. 25 0
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/EventListenerDefine.java
  13. 11 0
      hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/EventListenerExecutor.java
  14. 20 0
      hsweb-eventbus/pom.xml
  15. 1 0
      pom.xml

+ 15 - 0
hsweb-eventbus/hsweb-eventbus-api/pom.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hsweb-eventbus</artifactId>
+        <groupId>org.hswebframework.web</groupId>
+        <version>3.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hsweb-eventbus-api</artifactId>
+
+
+</project>

+ 9 - 0
hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventBus.java

@@ -0,0 +1,9 @@
+package org.hswebframework.web.eventbus;
+
+/**
+ * @author zhouhao
+ * @since 1.0
+ */
+public interface EventBus extends EventPublisher {
+
+}

+ 9 - 0
hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventListener.java

@@ -0,0 +1,9 @@
+package org.hswebframework.web.eventbus;
+
+/**
+ * @author zhouhao
+ * @since 1.0
+ */
+public interface EventListener<E> {
+    void onEvent(E event);
+}

+ 9 - 0
hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventPublisher.java

@@ -0,0 +1,9 @@
+package org.hswebframework.web.eventbus;
+
+/**
+ * @author zhouhao
+ * @since 1.0
+ */
+public interface EventPublisher {
+    void publish(Object event);
+}

+ 12 - 0
hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/EventSubscriber.java

@@ -0,0 +1,12 @@
+package org.hswebframework.web.eventbus;
+
+/**
+ * @author zhouhao
+ * @since 1.0
+ */
+public interface EventSubscriber {
+    <E> void subscribe(EventListener<E> listener);
+
+    <E> void subscribe(Class<E> eventType, EventListener<? extends E> listener);
+
+}

+ 12 - 0
hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/annotation/EventMode.java

@@ -0,0 +1,12 @@
+package org.hswebframework.web.eventbus.annotation;
+
+/**
+ *
+ * @author zhouhao
+ * @since
+ */
+public enum EventMode {
+    SYNC,
+    ASYNC,
+    BACKGROUND
+}

+ 20 - 0
hsweb-eventbus/hsweb-eventbus-api/src/main/java/org/hswebframework/web/eventbus/annotation/Subscribe.java

@@ -0,0 +1,20 @@
+package org.hswebframework.web.eventbus.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @author zhouhao
+ * @since 1.0
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+@Documented
+public @interface Subscribe {
+    EventMode mode() default EventMode.SYNC;
+
+    boolean transaction() default true;
+
+    int priority() default Integer.MIN_VALUE;
+
+}

+ 29 - 0
hsweb-eventbus/hsweb-eventbus-default/pom.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hsweb-eventbus</artifactId>
+        <groupId>org.hswebframework.web</groupId>
+        <version>3.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hsweb-eventbus-default</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-eventbus-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.hswebframework</groupId>
+            <artifactId>hsweb-utils</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 57 - 0
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/DefaultEventBus.java

@@ -0,0 +1,57 @@
+package org.hswebframework.web.eventbus;
+
+import lombok.extern.slf4j.Slf4j;
+import org.hswebframework.utils.ClassUtils;
+import org.hswebframework.web.eventbus.executor.EventListenerContainer;
+import org.hswebframework.web.eventbus.executor.EventListenerDefine;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * @author zhouhao
+ * @since 1.0
+ */
+@Slf4j
+public abstract class DefaultEventBus implements EventBus, EventSubscriber {
+    private ConcurrentMap<String, EventListenerContainer> listenerStorage = new ConcurrentHashMap<>();
+
+    @Override
+    public void publish(Object event) {
+        EventListenerContainer container = listenerStorage.get(getKey(event));
+        if (null != container) {
+            container.doExecute(event);
+        } else {
+            log.warn("event:{},not support!", event);
+        }
+    }
+
+    public String getKey(Object event) {
+        return getKey(event.getClass());
+    }
+
+    public String getKey(Class eventType) {
+        return eventType.getName();
+    }
+
+    @Override
+    public <E> void subscribe(EventListener<E> listener) {
+        Class<E> type = (Class<E>) ClassUtils.getGenericType(listener.getClass());
+        if (type == Object.class) {
+            throw new UnsupportedOperationException("event type [Object] not support!");
+        }
+        subscribe(type, listener);
+    }
+
+    @Override
+    public <E> void subscribe(Class<E> eventType, EventListener<? extends E> listener) {
+        EventListenerContainer container = listenerStorage
+                .computeIfAbsent(getKey(eventType), type -> createEventListenerContainer(listener));
+        container.addListener(createListenerDefine(listener));
+    }
+
+    protected abstract EventListenerContainer createEventListenerContainer(EventListener listener);
+
+    protected abstract EventListenerDefine createListenerDefine(EventListener listener);
+
+}

+ 22 - 0
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/DefaultEventPublisher.java

@@ -0,0 +1,22 @@
+package org.hswebframework.web.eventbus;
+
+import org.hswebframework.web.eventbus.executor.EventListenerExecutor;
+
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * @author zhouhao
+ * @since 1.0
+ */
+public class DefaultEventPublisher implements EventPublisher {
+
+    private ConcurrentMap<String, List<EventListenerExecutor>> listenerStorage = new ConcurrentHashMap<>();
+
+
+    @Override
+    public void publish(Object event) {
+
+    }
+}

+ 12 - 0
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/EventListenerContainer.java

@@ -0,0 +1,12 @@
+package org.hswebframework.web.eventbus.executor;
+
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+public interface EventListenerContainer {
+    void doExecute(Object event);
+
+    void addListener(EventListenerDefine listener);
+}

+ 25 - 0
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/EventListenerDefine.java

@@ -0,0 +1,25 @@
+package org.hswebframework.web.eventbus.executor;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Setter;
+import org.hswebframework.web.eventbus.annotation.EventMode;
+
+import java.util.EventListener;
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+@Getter
+@Setter
+@Builder
+public class EventListenerDefine {
+    private EventListener listener;
+
+    private EventMode eventMode;
+
+    private boolean transaction;
+
+    private int priority;
+}

+ 11 - 0
hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/executor/EventListenerExecutor.java

@@ -0,0 +1,11 @@
+package org.hswebframework.web.eventbus.executor;
+
+import org.hswebframework.web.eventbus.EventListener;
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+public interface EventListenerExecutor {
+    <E> void doExecute(EventListener<E> listener, E event);
+}

+ 20 - 0
hsweb-eventbus/pom.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hsweb-framework</artifactId>
+        <groupId>org.hswebframework.web</groupId>
+        <version>3.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hsweb-eventbus</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>hsweb-eventbus-api</module>
+        <module>hsweb-eventbus-default</module>
+    </modules>
+
+
+</project>

+ 1 - 0
pom.xml

@@ -40,6 +40,7 @@
         <module>hsweb-examples</module>
         <module>hsweb-boost</module>
         <module>hsweb-thirdparty</module>
+        <module>hsweb-eventbus</module>
     </modules>
 
     <packaging>pom</packaging>