事件服務,通過事件的注冊、訂閱和廣播完成事件消息的處理,目的是為了減少代碼侵入,降低模塊之間的業(yè)務耦合度,事件消息采用隊列存儲,采用多線程接口回調實現消息及消息上下文對象的傳輸,支持同步和異步兩種處理模式;
#------------------------------------- # 框架事件初始化參數 #------------------------------------- # 默認事件觸發(fā)模式(不區(qū)分大小寫),取值范圍:NORMAL-同步執(zhí)行,ASYNC-異步執(zhí)行,默認為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
ApplicationEvent:框架事件
APPLICATION_INITED - 框架初始化 APPLICATION_DESTROYED - 框架銷毀
ModuleEvent:模塊事件
MODULE_INITED - 模塊初始化 MODULE_DESTROYED - 模塊銷毀
注:以上只是YMP框架核心中包含的事件對象,其它模塊中包含的事件對象將在其相應的文檔描述中闡述;
方式一:通過代碼手動完成事件的訂閱
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: // 注意:這段代碼是不會被執(zhí)行的,因為在我們進行事件訂閱時,模塊的初始化動作已經完成 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接口實現事件的訂閱
// 首先創(chuàng)建事件注冊類,通過實現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對象,下面的代碼就是一個自定義事件對象:
創(chuàng)建自定義事件對象
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的注解中的第一個參數代表事件源對象類型,第二個參數是指定用于事件監(jiān)聽事件名稱的枚舉類型;
注冊自定義事件
YMP.get().getEvents().registerEvent(DemoEvent.class);
訂閱自定義事件
事件訂閱(或監(jiān)聽)需實現IEventListener接口,該接口的handle方法返回值在異步觸發(fā)模式下將影響事件監(jiān)聽隊列是否終止執(zhí)行,同步觸發(fā)模式下請忽略此返回值;
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; } });
當然,也可以通過@EventRegister
注解和IEventRegister接口實現自定義事件的訂閱;
注:當某個事件被觸發(fā)后,訂閱(或監(jiān)聽)該事件的接口被回調執(zhí)行的順序是不能被保證的;
觸發(fā)自定義事件
// 采用默認模式觸發(fā)事件 YMP.get().getEvents().fireEvent(new DemoEvent(YMP.get(), DemoEvent.class, DemoEvent.EVENT.CUSTOM_EVENT_ONE)); // 采用異步模式觸發(fā)事件 YMP.get().getEvents().fireEvent(Events.MODE.ASYNC, new DemoEvent(YMP.get(), DemoEvent.class, DemoEvent.EVENT.CUSTOM_EVENT_TWO));
示例測試代碼:
public static void main(String[] args) throws Exception { YMP.get().init(); try { // 注冊自定義事件對象 YMP.get().getEvents().registerEvent(DemoEvent.class); // 注冊自定義事件監(jiān)聽 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; } }); // 采用默認模式觸發(fā)事件 YMP.get().getEvents().fireEvent(new DemoEvent(YMP.get(), DemoEvent.class, DemoEvent.EVENT.CUSTOM_EVENT_ONE)); // 采用異步模式觸發(fā)事件 YMP.get().getEvents().fireEvent(Events.MODE.ASYNC, new DemoEvent(YMP.get(), DemoEvent.class, DemoEvent.EVENT.CUSTOM_EVENT_TWO)); } finally { YMP.get().destroy(); } }
更多建議: