イベントサービス(イベント)
イベント サービスは、イベントの登録、サブスクリプション、ブロードキャストを通じてイベント メッセージの処理を完了します。その目的は、コードの侵入を減らし、モジュール間のビジネスの結合を減らすことです。イベント メッセージはキューに保存され、マルチスレッド インターフェイスのコールバックがメッセージの実装に使用されます。コンテキスト オブジェクトの送信は、同期処理モードと非同期処理モードの両方をサポートします。
#-------------------------------------
# 框架事件初始化参数
#-------------------------------------
# 默认事件触发模式(不区分大小写),取值范围: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 コア イベント オブジェクト
れーれー
- ModuleEvent: モジュール イベント
APPLICATION_INITED - 框架初始化 APPLICATION_DESTROYED - 框架销毁
注
: 上記は、YMP フレームワークのコアに含まれるイベント オブジェクトのみです。他のモジュールに含まれるイベント オブジェクトについては、対応するセクションで説明します。ドキュメントの説明;イベント サブスクリプション
方法 1: コードを使用してイベント サブスクリプションを手動で完了する
MODULE_INITED - 模块初始化
MODULE_DESTROYED - 模块销毁
- 方法 2:
@EventRegister
アノテーションと IEventRegister を使用してイベント サブスクリプションを実装するインターフェイス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(); } }
カスタム イベント
@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(); } }
自定义事件
YMP的事件对象必须实现IEvent接口的同时需要继承EventContext对象,下面的代码就是一个自定义事件对象:
创建自定义事件对象
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); } }
说明:EventContext的注解中的第一个参数代表事件源对象类型,第二个参数是指定用于事件监听事件名称的枚举类型;
注册自定义事件
YMP.get().getEvents().registerEvent(DemoEvent.class);
订阅自定义事件
事件订阅(或监听)需实现IEventListener接口,该接口的handle方法返回值在异步触发模式下将影响事件监听队列是否终止执行,同步触发模式下请忽略此返回值;
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 のイベント オブジェクトは IEvent インターフェイスを実装し、EventContext オブジェクトを継承する必要があります。次のコードはカスタム イベント オブジェクトです:@EventRegister
カスタム イベント オブジェクトを作成します
// 采用默认模式触发事件 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));
イベント サブスクリプション (またはリスニング) は、IEventListener インターフェイスを実装する必要があります。このインターフェイスのハンドル メソッドの戻り値は、イベント リスニング キューが非同期トリガー モードで実行を終了するかどうかに影響します。同期トリガー モードでは、この戻り値を無視してください。手順: EventContext の注釈の最初のパラメーターはイベント ソース オブジェクトの種類を表し、2 番目のパラメーターはイベント監視のイベント名を指定する列挙型です。イベント-
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(); } }
もちろん、@EventRegister
アノテーションと IEventRegister インターフェイスを通じてカスタム イベントをサブスクライブすることもできます 注