更多精彩博文,敬请期待
规划愿景:打造一款全新的微服务框架望大家多多支持、鼓励,多多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是功能非常相似的事件监听器和事件派发器,强烈建议多使用CommandCommand、Proxy、Mediator中都能通过sendMessage方法向外派发事件,也可在此框架之外直接使用Facade实例调用sendMessage派发事件此框架的事件数据类型尽可能的使用int和StringFacade实例在调用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<String> result0 = asynMsg.setResult(\"ResultMsg\", new AsynResult<>()); facade.sendMessage(asynMsg, true); //异步发送事件通知 System.out.println(result0.get()); //获取同步执行结果 Message syncMsg = new Message(\"20000\", \"让ResultCommand接收执行\"); //由于事件通知为广播模式,故而必须为执行结果进行命名标识唯一性 IResult<String> result1 = syncMsg.setResult(\"ResultMsg\", new SyncResult<>()); facade.sendMessage(syncMsg, false); //同步发送事件通知 System.out.println(result1.get()); //另一种异步处理方式,同步派发事件,事件处理器中使用FutureTask及线程异步获取执行结果 Message syncMsg1 = new Message(\"30000\", \"让FutureCommand接收执行\"); IResult<String> result2 = syncMsg1.setResult(\"ResultMsg\", new SyncResult<>()); facade.sendMessage(syncMsg1, false); //同步发送事件通知 System.out.println(result2.get()); //哈哈,异步中的异步,其实没必要 Message syncMsg2 = new Message(\"30000\", \"让FutureCommand接收执行\"); IResult<String> 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); }}
(图片来源网络,侵删)
0 评论