首页 > 应用开发 > > Java 事件领域模型框架 kaka
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
facade.sendMessage(asynMsg, true); //异步发送事件通知
System.out.println(result0.get());
//获取同步执行结果
Message syncMsg = new Message("20000", "让ResultCommand接收执行");
//由于事件通知为广播模式,故而必须为执行结果进行命名标识唯一性
IResult
facade.sendMessage(syncMsg, false); //同步发送事件通知
System.out.println(result1.get());
//另一种异步处理方式,同步派发事件,事件处理器中使用FutureTask及线程异步获取执行结果
Message syncMsg1 = new Message("30000", "让FutureCommand接收执行");
IResult
facade.sendMessage(syncMsg1, false); //同步发送事件通知
System.out.println(result2.get());
//哈哈,异步中的异步,其实没必要
Message syncMsg2 = new Message("30000", "让FutureCommand接收执行");
IResult
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/ ,如需转载,请注明出处,否则将追究法律责任。