DamiBus v0.51 发布

人生乱弹 2年前 (2023) admin
13 0

DamiBus,专为本地多模块之间通讯解耦而设计(尤其是未知模块、隔离模块、领域模块)。零依赖,特适合 DDD。
特点
结合 Bus 与 RPC 的概念,可作事件分发,可作接口调用,可作响应订阅。

支持事务传导(同步分发、异常透传)
支持事件标识、拦截器(方便跟踪)
支持监听者排序、附件传递(多监听时,可相互合作)
支持 Bus 和 Api 两种体验风格

与常见的 EventBus、ApiBean 的区别

DamiBus
EventBus
Api
DamiBus 的情况说明

广播



发送(send) + 监听(listen)
以及 Api 模式

应答



发送并请求(sendAndRequest) + 监听(listen) + 答复(reply)
以及 Api 模式

回调
有+

有-
发送并订阅(sendAndSubscribe) + 监听(listen) + 答复(reply)

耦合
弱-
弱+
强++

如果涉及类加载器隔离:请在主程序标为编译,在其它模块标为可选。
本次更新了什么?

删除 Dami::intercept 接口,直接使用 Dami.bus()::intercept
更名 sendAndResponse 为 sendAndRequest!!!
更名 sendAndCallback 为 sendAndSubscribe!!!
添加 TopicDispatcher,将调度处理与路由器开发(更方便添加监控)
添加 InterceptorChain::getTargets 接口(可以知道有哪些订阅)
添加 Acceptor::isSingle 接口,用于识别单发还是多发接收
添加 Payload::isSubscribe 接口,用于识别订阅
调整 启用新的配置方式(配置路由时,不需要重新实例化总线)
调整 接口默认方法处理策略(有订阅执行订阅,无订阅者执行默认)
调整 createSender 调整类加载器的主体
调整 send,sendAndSubscribe 返回类型改为 bool(马上可以知道是否有订阅目标)

新增加的监视效果,基于拦截器:
public class Demo16_intercept {
@Test
public void main() throws Exception {
Dami.bus().intercept((payload, chain) -> {
System.out.println("开始监视...");
if (chain.getTargets().size() == 0) {
System.out.println("没有订阅...");
} else {
chain.getTargets().forEach(e -> System.out.println(e.getListener()));
chain.doIntercept(payload);
}
System.out.println("结速监视...");
});

//发送事件
Dami.bus().send("demo.hello", "world");
}
}

另一个方案是用重载派发器的方法:
public class Demo16_dispatcher {
@Test
public void main() throws Exception {
DamiConfig.configure(new TopicDispatcherMonitor());

Dami.bus().send("demo.hello", "world");
}
}

public class TopicDispatcherMonitor<C,R> extends TopicDispatcherDefault<C,R> {
@Override
protected void doDispatch(Payload<C, R> payload, List<TopicListenerHolder<C, R>> targets) throws Throwable {
//开始监视...
System.out.println("开始监视...");

//用 i,可以避免遍历时添加监听的异常
for (int i = 0; i < targets.size(); i++) {
TopicListener<Payload<C,R>> listener = targets.get(i).getListener();

//发送前监视...
System.out.println("发送前监视...");
listener.onEvent(payload);
//发送后监视...
System.out.println("发送后监视...");
}

//结速监视...
System.out.println("结速监视...");
}
}

疑问:
为什么不用分布式消息队列呢?不好意思,真的是不同的维度事儿。
项目地址

https://gitee.com/noear/dami
https://github.com/noear/dami

文章来源

版权声明:admin 发表于 2023年10月18日 am9:26。
转载请注明:DamiBus v0.51 发布 | 银库

相关文章

本站主题由 OneNav 一为主题强力驱动