DamiBus v0.51 发布
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("结速监视...");
}
}
疑问:
为什么不用分布式消息队列呢?不好意思,真的是不同的维度事儿。
项目地址
DamiBus v0.51 发布的更多相关文章
- JavaScript 工具库:Cloudgamer JavaScript Library v0.1 发布
JavaScript 工具库:Cloudgamer JavaScript Library v0.1 发布 研究了一年多的js,也差不多写一个自己的js库了.我写这个不算框架,只是一个小型的js工具 ...
- React Native v0.4 发布,用 React 编写移动应用
React Native v0.4 发布,自从 React Native 开源以来,包括超过 12.5k stars,1000 commits,500 issues,380 pull requests ...
- KubeEdge v0.2发布,全球首个K8S原生的边缘计算平台开放云端代码
KubeEdge开源背景 KubeEdge在18年11月24日的上海KubeCon上宣布开源,技术圈曾掀起一阵讨论边缘计算的风潮,从此翻开了边缘计算和云计算联动的新篇章. KubeEdge即Kube+ ...
- JuiceFS v0.17 发布,通过 1270 项 LTP 测试!
小伙伴们大家好,JuiceFS v0.17 在国庆小长假来临之际如期发布了!这是我们在 2021 年秋季推出的第二个版本,让我们直奔主题,看看都有哪些新变化吧. 本次更新累计 80+ 提交,共有 9 ...
- Scala.js v0.1 发布,在浏览器直接运行 Scala
今天我们发布了 Scala.js 的首个版本,这个项目是在今年六月份的时候宣布的. 第一个版本支持的特性: 支持所有 Scala 特性,包括宏,不过有一些 语义上的区别 可非常好的跟 JavaScri ...
- MinDoc v0.6 发布,轻量级文档在线管理系统
更新日志 新增 标签功能,可以根据标签组织项目 新增 用户删除功能,删除后的用户项目以及其他数据会自动转移到超级管理员账户上 新增 项目描述支持Markdown语法 优化 项目标签添加效果 优化 登录 ...
- PHP-Beast V0.6 发布 (PHP源码加密模块)
本版本主要修改了一些bug和增加了一些配置项: 1. 设置缓存大小可以使用单位, 例如: beast.cache_size = 10m; 2. 可以在配置文件中禁止beast模块, 例如: beast ...
- [Dev Blog] KCV插件 —— Provissy Tools 。
承蒙各位支持! 正式版已推出,请前往http://tieba.baidu.com/p/3398574166 或者前往:http://provissy.com/?p=7 请不要在这里回复,我无法保证回复 ...
- j2ee log4j集中式日志解决方案logpool-v0.4发布说明
logpool v0.4发布说明: 1.持久化采用mongodb非结构化存储实现,以满足后续调整的灵活需要:
- sqler 集成 terraform v0.12 生成资源部署文件
terraform v0.12 发布了,有好多新功能的添加,包括语法的增强,新函数的引入,更好的开发提示 只是当前对于一些老版本的provider 暂时还不兼容,但是大部分官方的provider 都是 ...
随机推荐
- Java初始化顺序及使用Spring情况下初始化
Java初始化顺序 1 无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out. ...
- JAVA类的加载(1) ——类的加载及类加载器介绍
过程:当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载.连接.初始化三个步骤来对该类进行初始化,有时候称为类加载(类初始化) 类加载 定义:类加载 指的是将类的class文件读入 ...
- JAVA 类显式加载
类显式加载 1.Class.forName("classloader.Dog"); 方式加载 Example1 1 package classloader; 2 3 publ ...
- 编译wasm Web应用
刚学完WebAssembly的入门课,卖弄一点入门知识. 首先我们知道wasm是目标语言,是一种新的V-ISA标准,所以编写wasm应用,正常来说不会直接使用WAT可读文本格式,更不会用wasm字节码 ...
- P2360 地下城主
题目大意 背景是逃离\(3D\)地下监狱,也就是三维样例,你可以前往所在小格的前方,后方,左方,右方,上层,下层的小格,'.'表示可走,'x'表示墙壁,'S'表示起点,'E'表示终点.每走一小格花费一 ...
- Cadence SPB 22.1 --学习基础01Day
1.电路图设计 ①.原理图设计 原理图符号-->原理图库:代替实际电子元器件的符号,主要就是引脚数目.引脚序号与实物对应: ②.PCB设计 PCB符合-->PCB封装库:电子元器件的各种实 ...
- Android app兼容低版本Java环境
原文地址: Android app兼容低版本Java环境 - Stars-One的杂货小窝 起因是修复一个Bug遇到的问题,找到了一个可以让app兼容低版本java的方法 众所周知,Android版本 ...
- liunx二进制包安装5.6MySQL数据库
官网下载对应的二进制版本安装包 https://downloads.mysql.com/archives/community/ # 解压二进制压缩包 [root@localhost ~]# wget ...
- SpringBoot整合简单的定时任务~
定时任务框架很多种Quartz,SpringTask,xxljob,PowerJob... 1.JDK提供的timer // JDK提供的 Timer timer = new Timer(); //t ...
- Collection和Map的区别
Collection接口,包含list和set子接口Collection和Map接口之间的主要区别在于:Collection中存储了一组对象,而Map存储关键字/值对.在Map对象中,每一个关键字最多 ...