ITPub博客

首页 > 应用开发 > > Java 事件领域模型框架 kaka

Java 事件领域模型框架 kaka

作者:pengjs991111 时间:2019-10-16 09:53:45 0 删除 编辑

kaka

项目介绍

kaka-core模块为全局事件通知框架,无任何第三方依赖。

kaka-aopwear模块为依赖于kaka-core和cglib实现的AOP框架。

在无需AOP功能且仅需要事件模型时,可仅引入kaka-core.jar;当引入kaka-aopwear、cglib后,将直接支持AOP而无需增加或者改动任何代码和配置。

kaka-test模块为使用范例,个人认为kaka-core就事件机制而言比google的EventBus更加强大。

本项目为本人十年左右的游戏后端框架中的核心部分,可解耦业务,简化程序复杂性,提高代码可读性,降低开发维护成本。

支持同步或者异步获取事件处理结果。


https://my.oschina.net/zkpursuit/blog/2989186 此博文为本框架 + servlet基于json通信的一个简单接口服务范例,此范例模式已应用于实际生产环境! 更多精彩博文,敬请期待!

规划愿景:打造一款全新的微服务框架。望大家多多支持、鼓励,多多star!!!

软件架构

kaka-core事件模型为单例 + 观察者模式,包含标准版本和多核版本,标准版可直接使用Facade中的静态常量facade,多核版则使用Facade.getInstance("core name")。标准版能应付绝大部分情况。

本项目的核心思想是解耦业务,通过Startup实例的scan方法扫描Command、Proxy、Mediator子类的注解,并将其注册到Facade中,由Facade处理事件流向。

Command、Mediator一般作为业务处理器处理业务,Proxy为数据模型(比如作为数据库service层),Command、Mediator中可通过getProxy方法获得Proxy数据模型。

Command只能监听注册到Facade中的事件,可多个事件注册同一个Command(也可理解为一个Command可监听多个事件),而Mediator则是监听多个自身感兴趣的事件,具体对哪些事件感兴趣则由listMessageInterests方法的返回值决定(总结:一个事件只能对应一个Command,一个Command可以对应多个事件;一个事件可以对应多个Mediator,一个Mediator可以对应多个事件;一个事件可以同时对应一个Command和多个Mediator;Command为动态创建,但可池化,Mediator为全局唯一);Command、Mediator是功能非常相似的事件监听器和事件派发器,强烈建议多使用Command。

Command、Proxy、Mediator中都能通过sendMessage方法向外派发事件,也可在此框架之外直接使用Facade实例调用sendMessage派发事件。

此框架的事件数据类型尽可能的使用int和String。

Facade实例在调用initThreadPool方法配置了线程池的情况下,Facade、Command、Proxy、Mediator的sendMessage都将直接支持异步派发事件,默认为同步。

统一同步或者异步获得事件处理结果,异步获取事件结果以wait、notifyAll实现。应该尽可能的少使用此方式,而改用派发事件方式。

kaka-aopwear为AOP功能实现,其功能生效同样需要借助Startup实例的scan扫描包。

安装教程

将kaka/kaka-core/target/kaka-core-{version}.jar引入项目即可使用本框架的事件领域模型。

将kaka/kaka-aopwear/target/kaka-aopwear-{version}.jar引入项目将直接支持AOP功能。

异步使用范例

/**

* 异步使用范例

*

* @author zkpursuit

*/

public class Asyn_Test extends Startup {

public static void main(String[] args) {

Asyn_Test test = new Asyn_Test();

test.scan("test");

facade.initThreadPool(Executors.newFixedThreadPool(2));

//同步发送事件通知

facade.sendMessage(new Message("1000", "让MyCommand接收执行"));

//简单的异步发送事件通知

facade.sendMessage(new Message("2000", "让MyMediator和MyCommand接收执行"), true);

/*

1、以下为测试发送事件通知后获得事件处理器的处理结果。

2、一般情况我们不一定需要此功能,为了尽可能的减少对象创建,故而

在需要使用此功能时手动创建AsynResult或者SyncResult对象。

3、我们应该尽可能的使用事件模式代替,比如事件处理器处理完成后再次

调用sendMessage向外派发事件,分散到其它事件处理器中处理,而不是等待处

理结果。

4、异步future模式获取事件处理结果其本质是利用wait、notify(notifyAll)

实现,而使用事件模式则无需调用wait让线程中断等待。

*/

//获取异步处理结果

Message asynMsg = new Message("10000", "让ResultCommand接收执行");

//由于事件通知为广播模式,故而必须为执行结果进行命名标识唯一性

IResult result0 = asynMsg.setResult("ResultMsg", new AsynResult ());

facade.sendMessage(asynMsg, true); //异步发送事件通知

System.out.println(result0.get());

//获取同步执行结果

Message syncMsg = new Message("20000", "让ResultCommand接收执行");

//由于事件通知为广播模式,故而必须为执行结果进行命名标识唯一性

IResult result1 = syncMsg.setResult("ResultMsg", new SyncResult ());

facade.sendMessage(syncMsg, false); //同步发送事件通知

System.out.println(result1.get());

//另一种异步处理方式,同步派发事件,事件处理器中使用FutureTask及线程异步获取执行结果

Message syncMsg1 = new Message("30000", "让FutureCommand接收执行");

IResult result2 = syncMsg1.setResult("ResultMsg", new SyncResult ());

facade.sendMessage(syncMsg1, false); //同步发送事件通知

System.out.println(result2.get());

//哈哈,异步中的异步,其实没必要

Message syncMsg2 = new Message("30000", "让FutureCommand接收执行");

IResult result3 = syncMsg2.setResult("ResultMsg", new AsynResult ());

facade.sendMessage(syncMsg2, true); //异步发送事件通知

System.out.println(result3.get());

facade.initScheduleThreadPool(Executors.newScheduledThreadPool(2));

long c = System.currentTimeMillis();

Scheduler scheduler = Scheduler.create("test")

.startTime(c + 3000) //3秒后开始执行

.endTime(c + 7000) //调度执行结束时间点

.interval(2000, TimeUnit.MILLISECONDS) //执行间隔

.repeat(5); //执行次数

//此处的执行次数为5次,但因执行到某次时超出设置的结束时间,故而实际次数将少于5次

facade.sendMessage(new Message("1000", "让MyCommand接收执行"), scheduler);

}

}

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/623/viewspace-3157277/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-12

  • 博文量
    221
  • 访问量
    785