Noark入门之异步事件

引入异步事件主要是为了各模块的解耦,每当完成一个动作时,向系统发布一个事件,由关心的模块自己监听处理,可选择同步处理,异步处理,延迟处理。

何时发布事件,当其他模块关心此动作时<br> 比如获得道具时,任务系统模块要判定完成进度,BI模块需要上报等等都可以监听此事件,已达模块解耦

0x00事件源

一个实现xyz.noark.core.event.Event接口的实现类

1public class ItemIncrEvent extends AbstractPlayerEvent { 2 private String itemcode; 3 private int count; 4 private IncrSource source; 5 6 public ItemIncrEvent(long playerId, String itemcode, int count, IncrSource source) { 7 super(playerId); 8 this.itemcode = itemcode; 9 this.count = count; 10 this.source = source; 11 } 12}

0x01发布事件

在我们获得道具逻辑下面发布此事件

1@Autowired 2private EventManager eventManager; 3 4eventManager.publish(new ItemIncrEvent(playerId, item.getTemplateId(), e.getValue(), source));

0x02处理事件

在对应的模块入口类中,也就是前面提到的Controller类.

1@EventListener(ItemIncrEvent.class) 2public void handleItemIncrEvent(ItemIncrEvent event) {}

这样便完成的事件处理逻辑.

0x03同步处理

注解@xyz.noark.core.annotation.controller.EventListener#async标识是否异步执行,默认为true

如果设置为false,此处理事件的逻辑将同步进行,如果有需要的话

如果要关闭事件显示的话,可以设置printLog=false

@EventListener(value = ItemIncrEvent.class, printLog = false)

0x04多事件异步有序执行

请在监听处理方法上添加@Order,值越小就越先执行.

0x05线程模型

在这里有必要聊一下线程问题,大多数异步事件功能的实现,都是在独立的线程池中执行的,这是一个区别

在0x02处理事件提到的Controller类,是不是我们的事件处理线程也遵循线程模型的划分呢,答案是肯定的

由于ItemIncrEvent实现了xyz.noark.core.event.PlayerEvent接口,如果Controller类上的标识为玩家线程组执行,则会自动派发给此玩家ID所对应的线程来执行.

eventManager在这里仅仅是一个调度者的身份,正式执行的任务线程是取决于Controller入口注解的线程组。

事件功能在冥冥之中响应了前面的线程模型的规划...

点赞
收藏

评论区

加载中...

相关推荐

Guava — EventBus

Guava提供了事件总线的一个实现方案EventBus。它是事件发布订阅模式的实现,观察者模式。Guava为我们提供了同步实现EventBus和异步实现AsyncEventBus两个事件总线,他们都不是单例的eventBus.post(1);eventBus.post(1L);post方法,直接发布事件订阅者需要注册进来,ev

EventBus源码分析

一、        EventBus简介1.1、EventBusEventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化Android事件传递,这里的事件可以理解为消息,本文中统一称为事件。事件传递既可用于Android四大组件间通讯,也可以用户异步线程和主线程间通讯等等。传统的事件

Fish Redux中的Dispatch是怎么实现的?

零.前言我们在使用fishredux构建应用的时候,界面代码(view)和事件的处理逻辑(reducer,effect)是完全解耦的,界面需要处理事件的时候将action分发给对应的事件处理逻辑去进行处理,而这个分发的过程就是下面要讲的dispatch,通过本篇的内容,你可以更深刻的理解一个action是如何一步步去进行分发的。一.从e

Python 日志(Log)

日志?日志,就是用来记录程序运行的时候都发生了什么事。事件按严重程度划分level事件内容:时间位置事件的严重程度level内容用logging模块实现logging模块

Event事件

07.07自我总结Event事件一.导入模块fromthreadingimportEvent二.概念线程间状态同步:即将一个任务丢到子进程中,这个任务将异步执行,如何获取到这个任务的执行状态注意:执行状态和执行结果不是同一个概念,异步回调拿到的是任务

Guava中的EventBus

其实代码中经常会遇到跟主流程分支出去的异步逻辑,比如说:爬虫处理逻辑中,进行心跳打点,订单处理中,需要触发用户的个人信息变更等。这个时候就应该使用观察者模式。EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建