이벤트 서비스(이벤트)
이벤트 서비스는 이벤트 등록, 구독 및 브로드캐스트를 통해 이벤트 메시지 처리를 완료합니다. 목적은 코드 침입을 줄이고 모듈 간의 비즈니스 결합을 줄이는 것입니다. 이벤트 메시지는 대기열에 저장되고 다중 스레드 인터페이스 콜백은 메시지 및 구현에 사용됩니다. 메시지 컨텍스트 객체의 전송은 동기 및 비동기 처리 모드를 모두 지원합니다.
#-------------------------------------
# 框架事件初始化参数
#-------------------------------------
# 默认事件触发模式(不区分大小写),取值范围:NORMAL-同步执行,ASYNC-异步执行,默认为ASYNC
ymp.event.default_mode=
# 事件管理提供者接口实现,默认为net.ymate.platform.core.event.impl.DefaultEventProvider
ymp.event.provider_class=
# 事件线程池初始化大小,默认为Runtime.getRuntime().availableProcessors()
ymp.event.thread_pool_size=
# 事件配置扩展参数,xxx表示自定义参数名称,vvv表示参数值
ymp.event.params.xxx=vvv
YMP 핵심 이벤트 객체
ApplicationEvent: 프레임워크 이벤트
APPLICATION_INITED - 框架初始化 APPLICATION_DESTROYED - 框架销毁
ModuleEvent: 모듈 eventMODULE_INITED - 模块初始化 MODULE_DESTROYED - 模块销毁
Note: 위의 내용은 YMP 프레임워크의 핵심에 포함된 이벤트 개체일 뿐입니다. 다른 모듈에 포함된 이벤트 개체에 대해서는 해당 항목에서 설명합니다. 문서화;
이벤트 구독
방법 1: 코드를 통해 수동으로 이벤트 구독 완료
public static void main(String[] args) throws Exception { YMP.get().init(); try { // 订阅模块事件 YMP.get().getEvents().registerListener(ModuleEvent.class, new IEventListener<ModuleEvent>() { @Override public boolean handle(ModuleEvent context) { switch (context.getEventName()) { case MODULE_INITED: // 注意:这段代码是不会被执行的,因为在我们进行事件订阅时,模块的初始化动作已经完成 System.out.println("Inited :" + context.getSource().getName()); break; case MODULE_DESTROYED: System.out.println("Destroyed :" + context.getSource().getName()); break; } return false; } }); } finally { YMP.get().destroy(); } }
방법 2:@EventRegister
주석 및 IEventRegister 인터페이스를 통해 이벤트 구독 구현// 首先创建事件注册类,通过实现IEventRegister接口完成事件的订阅 // 通过@EventRegister注解,该类将在YMP框架初始化时被自动加载 @EventRegister public class DemoEventRegister implements IEventRegister { public void register(Events events) throws Exception { // 订阅模块事件 events.registerListener(ModuleEvent.class, new IEventListener<ModuleEvent>() { @Override public boolean handle(ModuleEvent context) { switch (context.getEventName()) { case MODULE_INITED: System.out.println("Inited :" + context.getSource().getName()); break; case MODULE_DESTROYED: System.out.println("Destroyed :" + context.getSource().getName()); break; } return false; } }); // // ... 还可以添加更多的事件订阅代码 } } // 框架启动测试 public static void main(String[] args) throws Exception { YMP.get().init(); try { // Do Nothing... } finally { YMP.get().destroy(); } }
@EventRegister
注解和IEventRegister接口实现事件的订阅public class DemoEvent extends EventContext<Object, DemoEvent.EVENT> implements IEvent { public enum EVENT { CUSTOM_EVENT_ONE, CUSTOM_EVENT_TWO } public DemoEvent(Object owner, Class<? extends IEvent> eventClass, EVENT eventName) { super(owner, eventClass, eventName); } }
自定义事件
YMP的事件对象必须实现IEvent接口的同时需要继承EventContext对象,下面的代码就是一个自定义事件对象:
创建自定义事件对象
YMP.get().getEvents().registerEvent(DemoEvent.class);
说明:EventContext的注解中的第一个参数代表事件源对象类型,第二个参数是指定用于事件监听事件名称的枚举类型;
注册自定义事件
YMP.get().getEvents().registerListener(DemoEvent.class, new IEventListener<DemoEvent>() { public boolean handle(DemoEvent context) { switch (context.getEventName()) { case CUSTOM_EVENT_ONE: System.out.println("CUSTOM_EVENT_ONE"); break; case CUSTOM_EVENT_TWO: System.out.println("CUSTOM_EVENT_TWO"); break; } return false; } });
订阅自定义事件
事件订阅(或监听)需实现IEventListener接口,该接口的handle方法返回值在异步触发模式下将影响事件监听队列是否终止执行,同步触发模式下请忽略此返回值;
// 采用默认模式触发事件 YMP.get().getEvents().fireEvent(new DemoEvent(YMP.get(), DemoEvent.class, DemoEvent.EVENT.CUSTOM_EVENT_ONE)); // 采用异步模式触发事件 YMP.get().getEvents().fireEvent(Events.MODE.ASYNC, new DemoEvent(YMP.get(), DemoEvent.class, DemoEvent.EVENT.CUSTOM_EVENT_TWO));
当然,也可以通过
@EventRegister
YMP의 이벤트 개체는 IEvent 인터페이스를 구현하고 EventContext 개체를 상속해야 합니다. 다음 코드는 사용자 정의 이벤트 개체입니다. - 사용자 정의 이벤트 개체 만들기
public static void main(String[] args) throws Exception { YMP.get().init(); try { // 注册自定义事件对象 YMP.get().getEvents().registerEvent(DemoEvent.class); // 注册自定义事件监听 YMP.get().getEvents().registerListener(DemoEvent.class, new IEventListener<DemoEvent>() { public boolean handle(DemoEvent context) { switch (context.getEventName()) { case CUSTOM_EVENT_ONE: System.out.println("CUSTOM_EVENT_ONE"); break; case CUSTOM_EVENT_TWO: System.out.println("CUSTOM_EVENT_TWO"); break; } return false; } }); // 采用默认模式触发事件 YMP.get().getEvents().fireEvent(new DemoEvent(YMP.get(), DemoEvent.class, DemoEvent.EVENT.CUSTOM_EVENT_ONE)); // 采用异步模式触发事件 YMP.get().getEvents().fireEvent(Events.MODE.ASYNC, new DemoEvent(YMP.get(), DemoEvent.class, DemoEvent.EVENT.CUSTOM_EVENT_TWO)); } finally { YMP.get().destroy(); } }
지침: 첫 번째 EventContext 주석의 매개변수는 이벤트 소스 객체 유형을 나타내며, 두 번째 매개변수는 이벤트 모니터링을 위한 이벤트 이름을 지정하는 열거 유형입니다.
이벤트 구독(또는 수신)은 IEventListener 인터페이스를 구현해야 합니다. 이 인터페이스의 핸들 메서드 반환 값은 이벤트 수신 대기열이 비동기 트리거 모드에서 실행을 종료하는지 여부에 영향을 미칩니다.rrreee
@EventRegister
주석과 IEventRegister 인터페이스를 통해 맞춤 이벤트를 구독할 수도 있습니다. 🎜🎜🎜참고🎜: 이벤트가 트리거되면 구독(또는 청취)하세요. 이벤트 인터페이스가 콜백에 의해 실행되는 순서는 보장할 수 없습니다. 🎜🎜🎜🎜 사용자 정의 이벤트를 트리거합니다. 🎜🎜🎜rrreee🎜🎜🎜🎜🎜샘플 테스트 코드: 🎜🎜🎜rrreee🎜🎜🎜🎜🎜