com.github.lizhiwei88:easyevent-core

A tool easy to handle events

License

License

GroupId

GroupId

com.github.lizhiwei88
ArtifactId

ArtifactId

easyevent-core
Last Version

Last Version

0.3
Release Date

Release Date

Type

Type

jar
Description

Description

A tool easy to handle events
Project URL

Project URL

https://projects.spring.io/spring-boot/#/spring-boot-starter-parent/easyevent-core

Download easyevent-core

How to add to project

<!-- https://jarcasting.com/artifacts/com.github.lizhiwei88/easyevent-core/ -->
<dependency>
    <groupId>com.github.lizhiwei88</groupId>
    <artifactId>easyevent-core</artifactId>
    <version>0.3</version>
</dependency>
// https://jarcasting.com/artifacts/com.github.lizhiwei88/easyevent-core/
implementation 'com.github.lizhiwei88:easyevent-core:0.3'
// https://jarcasting.com/artifacts/com.github.lizhiwei88/easyevent-core/
implementation ("com.github.lizhiwei88:easyevent-core:0.3")
'com.github.lizhiwei88:easyevent-core:jar:0.3'
<dependency org="com.github.lizhiwei88" name="easyevent-core" rev="0.3">
  <artifact name="easyevent-core" type="jar" />
</dependency>
@Grapes(
@Grab(group='com.github.lizhiwei88', module='easyevent-core', version='0.3')
)
libraryDependencies += "com.github.lizhiwei88" % "easyevent-core" % "0.3"
[com.github.lizhiwei88/easyevent-core "0.3"]

Dependencies

test (1)

Group / Artifact Type Version
junit : junit jar 4.12

Project Modules

There are no modules declared in this project.

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);
    }

}

Versions

Version
0.3
0.2