事件服務(wù),通過(guò)事件的注冊(cè)、訂閱和廣播完成事件消息的處理,目的是為了減少代碼侵入,降低模塊之間的業(yè)務(wù)耦合度,事件消息采用隊(duì)列存儲(chǔ),采用多線程接口回調(diào)實(shí)現(xiàn)消息及消息上下文對(duì)象的傳輸,支持同步和異步兩種處理模式;
#------------------------------------- # 框架事件初始化參數(shù) #------------------------------------- # 默認(rèn)事件觸發(fā)模式(不區(qū)分大小寫(xiě)),取值范圍:NORMAL-同步執(zhí)行,ASYNC-異步執(zhí)行,默認(rèn)為ASYNC ymp.event.default_mode= # 事件管理提供者接口實(shí)現(xiàn),默認(rèn)為net.ymate.platform.core.event.impl.DefaultEventProvider ymp.event.provider_class= # 事件線程池初始化大小,默認(rèn)為Runtime.getRuntime().availableProcessors() ymp.event.thread_pool_size= # 事件配置擴(kuò)展參數(shù),xxx表示自定義參數(shù)名稱,vvv表示參數(shù)值 ymp.event.params.xxx=vvv
ApplicationEvent:框架事件
APPLICATION_INITED - 框架初始化 APPLICATION_DESTROYED - 框架銷毀
ModuleEvent:模塊事件
MODULE_INITED - 模塊初始化 MODULE_DESTROYED - 模塊銷毀
注:以上只是YMP框架核心中包含的事件對(duì)象,其它模塊中包含的事件對(duì)象將在其相應(yīng)的文檔描述中闡述;
方式一:通過(guò)代碼手動(dòng)完成事件的訂閱
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: // 注意:這段代碼是不會(huì)被執(zhí)行的,因?yàn)樵谖覀冞M(jìn)行事件訂閱時(shí),模塊的初始化動(dòng)作已經(jīng)完成 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(); } }
方式二:通過(guò)@EventRegister
注解和IEventRegister接口實(shí)現(xiàn)事件的訂閱
// 首先創(chuàng)建事件注冊(cè)類,通過(guò)實(shí)現(xiàn)IEventRegister接口完成事件的訂閱 // 通過(guò)@EventRegister注解,該類將在YMP框架初始化時(shí)被自動(dòng)加載 @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; } }); // // ... 還可以添加更多的事件訂閱代碼 } } // 框架啟動(dòng)測(cè)試 public static void main(String[] args) throws Exception { YMP.get().init(); try { // Do Nothing... } finally { YMP.get().destroy(); } }
YMP的事件對(duì)象必須實(shí)現(xiàn)IEvent接口的同時(shí)需要繼承EventContext對(duì)象,下面的代碼就是一個(gè)自定義事件對(duì)象:
創(chuàng)建自定義事件對(duì)象
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); } }
說(shuō)明:EventContext的注解中的第一個(gè)參數(shù)代表事件源對(duì)象類型,第二個(gè)參數(shù)是指定用于事件監(jiān)聽(tīng)事件名稱的枚舉類型;
注冊(cè)自定義事件
YMP.get().getEvents().registerEvent(DemoEvent.class);
訂閱自定義事件
事件訂閱(或監(jiān)聽(tīng))需實(shí)現(xiàn)IEventListener接口,該接口的handle方法返回值在異步觸發(fā)模式下將影響事件監(jiān)聽(tīng)隊(duì)列是否終止執(zhí)行,同步觸發(fā)模式下請(qǐng)忽略此返回值;
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; } });
當(dāng)然,也可以通過(guò)@EventRegister
注解和IEventRegister接口實(shí)現(xiàn)自定義事件的訂閱;
注:當(dāng)某個(gè)事件被觸發(fā)后,訂閱(或監(jiān)聽(tīng))該事件的接口被回調(diào)執(zhí)行的順序是不能被保證的;
觸發(fā)自定義事件
// 采用默認(rèn)模式觸發(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));
示例測(cè)試代碼:
public static void main(String[] args) throws Exception { YMP.get().init(); try { // 注冊(cè)自定義事件對(duì)象 YMP.get().getEvents().registerEvent(DemoEvent.class); // 注冊(cè)自定義事件監(jiān)聽(tīng) 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; } }); // 采用默認(rèn)模式觸發(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(); } }
更多建議: