Service événementiel (Événement)
Le service d'événement complète le traitement des messages d'événement via l'enregistrement, l'abonnement et la diffusion des événements. Le but est de réduire l'intrusion de code et de réduire le couplage commercial entre les modules. Les messages d'événement sont stockés dans des files d'attente et les rappels d'interface multithread sont utilisés pour implémenter les messages et. messages. La transmission des objets contextuels prend en charge les modes de traitement synchrone et asynchrone ;
ModuleEvent : Module event
#------------------------------------- # 框架事件初始化参数 #------------------------------------- # 默认事件触发模式(不区分大小写),取值范围: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
- Remarque
- : Les objets événement ci-dessus sont uniquement inclus dans le noyau du framework YMP. Les objets événement inclus dans d'autres modules seront expliqués dans leur correspondance. descriptions des documents ; Abonnement à un événement
- Méthode 1 : Compléter l'abonnement à un événement manuellement via l'annotation code
APPLICATION_INITED - 框架初始化 APPLICATION_DESTROYED - 框架销毁
@EventRegister
et IEventRegister interface
MODULE_INITED - 模块初始化 MODULE_DESTROYED - 模块销毁
- Événements personnalisés
L'objet événement de YMP doit implémenter l'interface IEvent et hériter de l'objet EventContext Le code suivant est un objet événement personnalisé :
Créer un objet événement personnalisé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; } });
当然,也可以通过
Instructions : Le le premier paramètre dans l'annotation de EventContext représente le type d'objet source d'événement, et le deuxième paramètre est le type d'énumération qui spécifie le nom de l'événement pour la surveillance des événements@EventRegister
Enregistrer des événements personnalisés
// 采用默认模式触发事件 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));
S'abonner à des événements personnalisés ; événements- L'abonnement (ou l'écoute) aux événements doit implémenter l'interface IEventListener.La valeur de retour de la méthode handle de cette interface affectera si la file d'attente d'écoute des événements termine l'exécution en mode déclencheur asynchrone. Bien sûr, vous pouvez également vous abonner à des événements personnalisés via l'annotation
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
et l'interface IEventRegister