事件服務(wù)(Event)

2018-12-24 21:53 更新

事件服務(wù),通過(guò)事件的注冊(cè)、訂閱和廣播完成事件消息的處理,目的是為了減少代碼侵入,降低模塊之間的業(yè)務(wù)耦合度,事件消息采用隊(duì)列存儲(chǔ),采用多線程接口回調(diào)實(shí)現(xiàn)消息及消息上下文對(duì)象的傳輸,支持同步和異步兩種處理模式;

框架事件初始化配置參數(shù)
#-------------------------------------
# 框架事件初始化參數(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
YMP核心事件對(duì)象
  • 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();
        }
    }
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)