Perkhidmatan acara (Acara)


Perkhidmatan acara melengkapkan pemprosesan mesej acara melalui pendaftaran acara, langganan dan siaran Tujuannya adalah untuk mengurangkan pencerobohan kod dan mengurangkan gandingan perniagaan antara modul Mesej acara disimpan dalam baris gilir dan panggilan balik antara muka berbilang benang digunakan untuk melaksanakan mesej dan mesej. Penghantaran objek konteks menyokong kedua-dua mod pemprosesan segerak dan tak segerak;

#-------------------------------------
# 框架事件初始化参数
#-------------------------------------

# 默认事件触发模式(不区分大小写),取值范围: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
ModulEvent: Modul event
APPLICATION_INITED - 框架初始化
APPLICATION_DESTROYED - 框架销毁
  • Nota

    : Di atas hanyalah objek acara yang termasuk dalam teras rangka kerja YMP yang lain akan diterangkan dalam objek acara yang sepadan Deskripsi dokumen;
    Event Subcription
  • Method 1: Langganan Acara Lengkap Secara Manual Melalui Code
    RREEEEMETHOD 2: Melaksanakan Langganan Acara Melalui @EventRegister Annotation dan ieventregister antara muka
MODULE_INITED - 模块初始化
MODULE_DESTROYED - 模块销毁

Acara tersuai
Objek acara YMP mesti melaksanakan antara muka IEvent dan mewarisi objek EventContext Kod berikut ialah objek acara tersuai:
  • Buat objek acara tersuai
    rreee
    Arahan
  • . parameter pertama dalam anotasi EventContext mewakili jenis objek sumber acara, dan parameter kedua ialah jenis penghitungan yang menentukan nama acara untuk pemantauan acara

    @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();
        }
    }
自定义事件

YMP的事件对象必须实现IEvent接口的同时需要继承EventContext对象,下面的代码就是一个自定义事件对象:

  • 创建自定义事件对象

    // 首先创建事件注册类,通过实现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();
        }
    }

    说明: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);
        }
    }
  • 订阅自定义事件

    事件订阅(或监听)需实现IEventListener接口,该接口的handle方法返回值在异步触发模式下将影响事件监听队列是否终止执行,同步触发模式下请忽略此返回值;

    YMP.get().getEvents().registerEvent(DemoEvent.class);

    当然,也可以通过@EventRegister

    Daftar acara tersuai

    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;
        }
    });
  • melanggan
    ; acara
    Langganan acara (atau mendengar) perlu melaksanakan antara muka IEventListener Nilai pulangan kaedah pemegang antara muka ini akan mempengaruhi sama ada baris gilir mendengar acara menamatkan pelaksanaan dalam mod pencetus tak segerak ini.
  • // 采用默认模式触发事件
    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));

    Sudah tentu, anda juga boleh melanggan acara tersuai melalui @EventRegister anotasi dan antara muka IEventRegister
  • Nota
: Apabila acara dicetuskan, langgan; ke acara perintah di mana antaramuka acara dilaksanakan oleh panggilan balik tidak dapat dijamin;