Skip to main content

事件驱动

本框架支持应用内部和集群节点间事件驱动,集群事件将会在微服务版块进行专题介绍,这里只介绍应用内部事件驱动。

系统预定义事件#

  1. 定义事件
    系统预定义事件都以字符串常量的方式放在Event类中。

  2. 触发事件
    系统预定义事件都由框架自行触发,无须用户触发。如确有必要,触发方式和下面自定义事件的触发方式一样。

  3. 注解方式监听事件

  • 首先定义监听器方法,方法可以是无参数方法,如果需要事件参数,方法也可以有一个入参,即事件类型,通用事件的入参是GeneralEvent类型。
  • 为该方法添加@EventListener注解,该注解有多个参数可供设置,name用来指定通用事件类型,async用来设定同步或异步触发,condition用来补充设置触发条件,order用来设定监听器优先级权重。 请看下面的实例:
public class EventService {
// 下面的方法有一个GeneralEvent入参来接收事件对象,@EventListener注解指定了以异步方式来接收事件类型为WEB_SERVER_CREATE的事件,即WEB服务器创建事件
@EventListener(name = Event.WEB_SERVER_CREATE, async = true)
public void predefinedEvent(GeneralEvent event){
// 通过事件对象,可以获取事件参数,event.getSender()可以获得事件触发对象,如果事件触发对象有额外参数提供,通过event.getObject()可以获取到。
System.out.println(event.getSender().toString());
}
}
  1. 程序动态监听事件
    有时候需要动态的监听事件,而不是一开始就能通过@EventListener注解确定监听的事件类型。 首先单独定义一个监听类,和上面一样定义一个监听器方法,这里是eventHandler(GeneralEvent event),有一个入参接收事件对象。 然后定义一个动态监听方法来动态绑定监听器和事件,例如下面的listen(Event event, boolean async),根据需要自行设计。
public class ListenToEvent {
public void listen(String event, boolean async){
Ready.eventManager().addListener(this, "eventHandler",
(setter -> setter.addName(event).setAsync(async)));
}
public void eventHandler(GeneralEvent event) {
System.err.println(event.getSender().toString());
}
}

然后在程序中可以随时利用上面的类来动态的监听事件:

public class Main extends Application {
public static void main(String[] args) {
// 这里利用上面的动态监听器类,监听服务器启动事件,以同步方式触发
new ListenToEvent().listen(Event.READY_WORK_SERVER_START, false);
Ready.For(Main.class).Work(args);
}
}

自定义事件#

  1. 定义事件
    本框架中事件分为通用事件和特定事件,通用事件因为简单快捷应用最广,系统预定义事件都是通用事件。两种类型事件都可以用户端自定义:
  • 通用事件
    首先定义一个事件容器,每个事件就是一个字符串常量。请务必确定事件名称不能和系统预定义事件名称重复。见下面实例:
public class AppEvent {
public static final String APP_INITIALIZE = "APP_INITIALIZE";
}
  • 特定事件
    特定事件可以深度自定义事件对象,可以开发更复杂的事件行为。需要继承自BaseEvent事件基类,见下面的实例:
public class CustomizedEvent<T> extends BaseEvent<T> {
private String message;
public CustomizedEvent(T source, String message) {
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
}

上面的实例定义了一个事件,支持传递字符串消息。

  1. 触发事件
    事件触发通常可以直接Ready.post(事件对象)方式触发,通用事件对象由GeneralEvent类包装,自定义特定事件就是特定事件对象实例。
public class Main extends Application {
@Override
protected void initialize() {
// 这里触发上面自定义的通用事件APP_INITIALIZE,并传递触发对象this和事件参数,这里将当前应用的配置对象传递给事件接收器
Ready.post(new GeneralEvent(AppEvent.APP_INITIALIZE, this, applicationConfig()));
// 这里触发上面自定义的特定事件CustomizedEvent,并传递触发对象this和事件的message参数
Ready.post(new CustomizedEvent<>(this, getName() + " is initializing..."));
}
public static void main(String[] args) {
Ready.For(Main.class).Work(args);
}
}
  1. 监听事件
    和上面的预定义事件一样,可以通过注解和程序动态添加监听器来监听事件。通用事件和特定事件的监听方式略有不同,见下面的实例:
public class EventService {
// 这是上面的实例,监听系统预定义事件,系统预定义事件都是通用事件
@EventListener(name = Event.WEB_SERVER_CREATE, async = true)
public void predefinedEvent(GeneralEvent event){
System.out.println(event.getSender().toString());
}
// 这里监听用户自定义的通用事件APP_INITIALIZE
@EventListener(name = AppEvent.APP_INITIALIZE, async = true)
public void userDefinedEvent(GeneralEvent event){
// 通过getSender()获取事件发送对象
System.out.println(event.getSender().toString());
// 通过getObject()获取事件发送对象传递的参数,这里收到的应该是上面传递的应用配置对象
System.out.println(event.getObject().toString());
}
// 这里监听用户自定义的特定事件CustomizedEvent,注意注解参数和上面不一样,接收方法的入参也要匹配事件类型
@EventListener(CustomizedEvent.class)
public <T> void listenToCustomizedEvent(CustomizedEvent<T> customizedEvent) {
// 通过getSource()获取事件发送对象
System.err.println(customizedEvent.getSource().toString());
// 通过自定义的getMessage()获取事件发送对象传递的message,这里是一个字符串消息
System.err.println(customizedEvent.getMessage());
}
}

上面实例演示了自定义事件的注解方式监听,程序方式监听和前面的系统预定义事件相同。

更多文档#

以上是本框架提供的常用事件驱动应用介绍,还有更多事件方面的文档将在后续不断完善,重点内容将以专题形式提供。