-
Notifications
You must be signed in to change notification settings - Fork 5
Event cn
xquan edited this page Oct 10, 2016
·
1 revision
事件框架提供了事件的分发的功能,支持同步和异步的事件处理机制。
首先通过IEvent接口来定义一个事件:
public class MyEvent implements IEvent {
public static final String TOPIC = "MyTopic";
private final String _name;
public MyEvent(String name) {
this._name = name;
}
@Override
public String topic() {
return TOPIC;
}
public String name() {
return this._name;
}
}
所有事件对象必须提供一个事件的topic,用来匹配对应的事件处理器。
有了事件,还需要对应的事件处理器来处理该事件:
@Service(IEventHandler.class)
@Tag("Event Demo")
public class MyEventHandler implements IEventHandler {
@Inject
protected ILogger _logger;
@Override
public String topic() {
return MyEvent.TOPIC;
}
@Override
public void handle(IEvent event) {
this._logger.info("Processing a new event...");
assert event != null;
assert event instanceof MyEvent;
assert ((MyEvent) event).name().equals("new event");
}
}
首先事件处理器必须是一个IEventHandler类型的服务,因为EventBus通过IEventHandler类型来注入事件处理器。事件处理器必须实现IEventHandler接口,该接口只有两个方法,一个是topic方法,该方法告知EventBus该处理器是如何匹配事件对象的,另一个方法handle将提供处理事件的代码。
通过EventBus服务可以抛出各种自定义的事件:
@Service
@Tag("Event Demo")
public class EventSource {
@Inject
protected IEventBus _eventBus;
public void riseEvent() {
this._eventBus.fire(new MyEvent("new event"));
}
}
通过IEventBus的fire方法可以抛出指定的事件,fire方法有两个重载版本,上面例子抛出的事件是异步处理的,也就是该fire方法会立即返回,事件处理不会阻塞抛出事件的线程。另一个版本是同步版本:
void fire(IEvent event, boolean syncable) throws NoEventHandlerException;
调用该方法意味着抛出事件的线程会阻塞直到事件被处理完毕才返回。
配置路径 | 配置类型 | 描述 | 是否必须 | 默认值(行为) |
---|---|---|---|---|
event.await-time | IntervalTime | 指定当EventBus销毁时的等待时间 | 否 | 10s |