Noark入门之异步事件

Stella981
• 阅读 481

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

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

0x00事件源

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

public class ItemIncrEvent extends AbstractPlayerEvent {
    private String itemcode;
    private int count;
    private IncrSource source;

    public ItemIncrEvent(long playerId, String itemcode, int count, IncrSource source) {
        super(playerId);
        this.itemcode = itemcode;
        this.count = count;
        this.source = source;
    }
}

0x01发布事件

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

@Autowired
private EventManager eventManager;

eventManager.publish(new ItemIncrEvent(playerId, item.getTemplateId(), e.getValue(), source));

0x02处理事件

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

@EventListener(ItemIncrEvent.class)
public 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入口注解的线程组。

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

点赞
收藏
评论区
推荐文章
Stella981 Stella981
2年前
Guava — EventBus
Guava提供了事件总线的一个实现方案EventBus。它是事件发布订阅模式的实现,观察者模式。Guava为我们提供了同步实现EventBus和异步实现AsyncEventBus两个事件总线,他们都不是单例的eventBus.post(1);eventBus.post(1L);post方法,直接发布事件订阅者需要注册进来,ev
Stella981 Stella981
2年前
EventBus源码分析
一、        EventBus简介1.1、EventBusEventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化Android事件传递,这里的事件可以理解为消息,本文中统一称为事件。事件传递既可用于Android四大组件间通讯,也可以用户异步线程和主线程间通讯等等。传统的事件
Stella981 Stella981
2年前
Fish Redux中的Dispatch是怎么实现的?
零.前言我们在使用fishredux构建应用的时候,界面代码(view)和事件的处理逻辑(reducer,effect)是完全解耦的,界面需要处理事件的时候将action分发给对应的事件处理逻辑去进行处理,而这个分发的过程就是下面要讲的dispatch,通过本篇的内容,你可以更深刻的理解一个action是如何一步步去进行分发的。一.从e
Stella981 Stella981
2年前
Python 日志(Log)
日志?日志,就是用来记录程序运行的时候都发生了什么事。事件按严重程度划分level事件内容:时间位置事件的严重程度level内容用logging模块实现logging模块
Stella981 Stella981
2年前
Event事件
07.07自我总结Event事件一.导入模块fromthreadingimportEvent二.概念线程间状态同步:即将一个任务丢到子进程中,这个任务将异步执行,如何获取到这个任务的执行状态注意:执行状态和执行结果不是同一个概念,异步回调拿到的是任务
Stella981 Stella981
2年前
Guava中的EventBus
其实代码中经常会遇到跟主流程分支出去的异步逻辑,比如说:爬虫处理逻辑中,进行心跳打点,订单处理中,需要触发用户的个人信息变更等。这个时候就应该使用观察者模式。EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建
Easter79 Easter79
2年前
Spring中ApplicationContext的事件机制
   ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件处理。如果容器中有一个ApplicationListenerBean,每当ApplicationContext发布ApplicationEvent时,
Stella981 Stella981
2年前
Noark入门之协议映射
0x00消息控制器消息控制器,主要作用就是为每个模块提供消息处理的入口.这里的消息不仅仅是协议,还有内部指令,事件等等逻辑入口,这也是为了响应线程模型作出的一种支撑,只要入口在此消息控制器内,那必然走期望的线程调度。@Controller用于标识一个类为当前模块的消息控制器入口.@Controller(threadGroup
Stella981 Stella981
2年前
JavaScript——页面相关事件
页面事件是在页面加载或改变浏览器的大小、位置,以及对页面中的滚动条进行操作时,所触发的事件处理程序。加载与卸载事件加载事件(onload)是在网页加载完毕后触发相应的事件处理程序,它可以在网页加载完成后对网页中的表格样式、字体、背景颜色等进行设置。卸载事件(unload)是在卸载网页时触发相应的事件处理程序,卸载网页是指关闭当前页或
胖大海 胖大海
1年前
Redis 原理
架构原理Redis组件的系统架构如图所示,主要包括事件处理、数据存储及管理、用于系统扩展的主从复制/集群管理,以及为插件化功能扩展的ModuleSystem模块。!(https://imgblog.csdnimg.cn/i