kaka-core服务于 Java 后端的事件领域模型框架
kaka-core 是一项服务于 Java 后端的事件领域模型,全局事件通知框架。
无任何第三方依赖,源码中已包含使用范例;可解耦业务,简化程序复杂性,提高代码可读性,降低开发维护成本。
本项目为 https://gitee.com/zkpursuit/kaka-notice-lib 核心部分,在此作为独立软件仅说明此次功能增强部分。
此次更新主要强化和稳定以下两个功能点:
1、单个事件对应多个 Command,3.0版本之前仅支持一个 Command 对应多个事件。在此基础上同名事件对应的 Command 新增执行优先级,可依此模拟切面编程,以下代码为模拟切面方法拦截器,获取主体业务执行耗时。
//基于事件模拟切面编程,仅支持Command
sendMessage(new Message("40000"), true);
package kaka.test.unit;
import com.kaka.notice.Command;
import com.kaka.notice.Message;
import com.kaka.notice.annotation.Handler;
/**
* 模拟切面
*/
@Handler(cmd = "40000", type = String.class, priority = 2)
public class SimulateAopCommand extends Command {
@Override
public void execute(Message msg) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Aop业务执行");
}
}
package kaka.test.unit;
import com.kaka.notice.Command;
import com.kaka.notice.IResult;
import com.kaka.notice.Message;
import com.kaka.notice.SyncResult;
import com.kaka.notice.annotation.Handler;
/**
* 模拟切面,执行前
*/
@Handler(cmd = "40000", type = String.class, priority = 1)
public class SimulateAopBeforeCommand extends Command {
@Override
public void execute(Message msg) {
IResult execStartTime = new SyncResult<>(); //中间变量亦可使用 ThreadLocal 存储
execStartTime.set(System.currentTimeMillis());
msg.setResult("execStartTime", execStartTime);
}
}
package kaka.test.unit;
import com.kaka.notice.Command;
import com.kaka.notice.IResult;
import com.kaka.notice.Message;
import com.kaka.notice.annotation.Handler;
/**
* 模拟切面,执行后
*/
@Handler(cmd = "40000", type = String.class, priority = 3)
public class SimulateAopAfterCommand extends Command {
@Override
public void execute(Message msg) {
IResult execStartTime = msg.getResult("execStartTime");
long offset = System.currentTimeMillis() - execStartTime.get();
System.out.println("Aop业务执行耗时:" + offset);
}
}
2、异步回调获取事件处理结果,此功能为同步获取事件处理结果的增强和优化。
sendMessage(new Message("50000", "", (IResult<Object> result) -> {
Class clasz = ((CallbackResult<Object>) result).eventHanderClass;
StringBuilder sb = new StringBuilder("异步回调:\\t" + clasz.getTypeName() + "\\t");
Object resultObj = result.get();
if (resultObj instanceof Object[]) {
Object[] ps = (Object[]) resultObj;
sb.append(Arrays.toString(ps));
} else {
sb.append(resultObj);
}
System.out.println(sb);
}), true);
以上范例代码均可在源码test中查阅,其中包括常用通用性范例。
评论