Easy Event
一个易于处理事件的工具
介绍
EasyEvent用于在异步场景下,对监听对象进行事件的通知处理. 主要分为两个功能
- 将事件通知到对应的客户. 即 OutBoundEvent
- 客户触发的事件交由相应的事件处理.即 InBoundEvent
EventDispatcher
EventDispatcher是将事件通知到监听客户.
EventHandler
EventHandler是客户触发的事件与参数发送给监听的事件处理对象处理
使用
example模块为websocket应用实例
Base
<dependency>
    <groupId>com.github.lizhiwei88</groupId>
    <artifactId>easyevent-core</artifactId>
    <version>0.3</version>
</dependency> 
客户订阅事件
/**
* 发布给客户的事件
*/
public class CustomOutBoundEvent implements OutBoundEvent<Client> {
        
        /**
        * 业务参数
        */
        private int age;
        /**
        * 业务参数
        */
        private String name;
        /**
         * 事件业务
         *
         * @param client 客户
         */
        @Override
        void execute(CLient client) {
            // 业务处理
            // ...
            client.sendMessage("result");
        }   
} 
处理客户触发的事件
/**
* 定义监听的事件 通过注解自动加载到EventHandler中
*/
// @EasyEvent(value = "login", group= "group")
@EasyEvent("login")
public class LoginInBoundEvent implements InBoundEvent<WebSocketSession> {
    @Override
    public void execute(WebSocketSession client, Object parameter) {
        try {
            // 业务处理
            // 参数处理
            client.sendMessage(new TextMessage("login event"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
} 
订阅对象
/**
* demo
*/
public class DemoClass {
    private static final EventDispatcher<Client> eventDispatcher = new EventDispatcher<>();
    private static final EventHandler<Client> eventHandler = new EventHandler<>();
    /**
     * eventDispatcher加入监听客户
     * @param client 实现OutBoundEvent
     */
    public void addClientToEventDispatcher(Client client) {
        // eventDispatcher.subscribe("name", "group", client);
        eventDispatcher.subscribe("name", client);
    }
    /**
     * 将事件分发给客户
     * @param outBoundEvent 自定义的事件
     */
    public void publishToClient(OutBoundEvent<Client> outBoundEvent) {
        // eventDispatcher.publish("group", outBoundEvent); // 发布指定监听组
        // eventDispatcher.publishAll(outBoundEvent); // 发布全部监听组
        eventDispatcher.publish(outBoundEvent); // 发布默认监听组
    }
    /**
     * 订阅监听事件 等待客户触发
     * @param inBoundEvent
     */
    public void addEventToEventHandler(InBoundEvent<Client> inBoundEvent) {
        // eventHandler.subscribe("name", "group", inBoundEvent);
        eventHandler.subscribe("name", inBoundEvent);
    }
    /**
     * 将客户请求的事件和参数发送到对象的事件处理业务上
     * @param eventType 事件类型
     * @param client 客户
     * @param parameter 参数
     */
    public void onEvent(String eventType, Client client, Object parameter) {
        // eventHandler.onEvent(eventType , "group", client, parameter);
        eventHandler.onEvent(eventType ,client, parameter);
    }
} 
SpringBoot
<dependency>
    <groupId>com.github.lizhiwei88</groupId>
    <artifactId>easyevent-spring-boot-starter</artifactId>
    <version>0.3</version>
</dependency> 
客户订阅事件
/**
* 发布给客户的事件
*/
public class CustomOutBoundEvent implements OutBoundEvent<Client> {
        
        /**
        * 业务参数
        */
        private int age;
        /**
        * 业务参数
        */
        private String name;
        /**
         * 事件业务
         *
         * @param client 客户
         */
        @Override
        void execute(CLient client) {
            // 业务处理
            // ...
            client.sendMessage("result");
        }   
} 
@Component
public class Service {
    /**
    * 管理订阅客户Bean
    */
    @Autowired
    private EventDispatcher eventDispatcher;
    /**
    * 订阅. client客户. 例如: WebsocketSession 或 Netty下的Channel
    */
    public void subscribe(String name, CLient client) {
        // eventDispatcher.subscribe("name", "group", client);
        eventDispatcher.subscribe("name", client);
    }
    
    /**
    * 取消订阅
    */
    public void unsubscribe(String name) {
        // eventDispatcher.unsubscribeDefaultGroup() // 取消全部默认组
        // eventDispatcher.unsubscribeGroup("group") // 取消全部指定组
        // eventDispatcher.unsubscribe(name, "group"); // 取消订阅指定组中的name
        eventDispatcher.unsubscribe(name); // 取消订阅默认组中的name
    }
    /**
    * 发布事件 
    * 将OutBoundEvent类型的事件通知到客户
    */
    public void publish() {
        CustomOutBoundEvent outBoundEvent = new CustomOutBoundEvent(18, "jack");
        // eventDispatcher.publish("group", outBoundEvent); // 发布指定监听组
        // eventDispatcher.publishAll(outBoundEvent); // 发布全部监听组
        eventDispatcher.publish(outBoundEvent); // 发布默认监听组
    }
} 
处理客户触发的事件
/**
* 定义监听的事件 通过注解自动加载到EventHandler中
*/
// @EasyEvent(value = "login", group= "group")
@EasyEvent("login")
public class LoginInBoundEvent implements InBoundEvent<WebSocketSession> {
    @Override
    public void execute(WebSocketSession client, Object parameter) {
        try {
            // 业务处理
            // 参数处理
            client.sendMessage(new TextMessage("login event"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
} 
/**
* 事件接收
*/
@Component
public class WebsocketService {
    /**
    * 管理订阅客户Bean
    */
    @Autowired
    private EventHandler eventHandler;
    /**
    * 订阅. client客户. 例如: WebsocketSession 或 Netty下的Channel
    */
    public void onMessage(WebSocketSession client, Message message) {
        /**
        * 指定事件类型 触发事件
        */
        // eventHandler.onEvent(message.eventType , "group", session, message);
        eventHandler.onEvent(message.eventType, session, message);
    }
} 
 JarCasting
 JarCasting