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 {@Testpublic 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 {@Testpublic void main() throws Exception {DamiConfig.configure(new TopicDispatcherMonitor());Dami.bus().send("demo.hello", "world");}
}public class TopicDispatcherMonitor<C,R> extends TopicDispatcherDefault<C,R> {@Overrideprotected 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
相关文章:
DamiBus v0.51 发布
DamiBus,专为本地多模块之间通讯解耦而设计(尤其是未知模块、隔离模块、领域模块)。零依赖,特适合 DDD。 特点 结合 Bus 与 RPC 的概念,可作事件分发,可作接口调用,可作响应订阅。 支持事务传…...
[OpenJDK:环境变量配置]:填充Profile并修改默认配置
文章目录 一:背景:安装hadoop启动提示未找到JAVA_HOME1.1:配置Hadoop的Java环境变量 二:排查-定位解决2.1:查看环境变量配置发现没有JAVA_HOME2.1.1:解决:查看java安装目录2.1.2:再次…...
连接mysql报错 :Host ‘xxx.xx.x.x‘ is not allowed to connect to this MySQL server
排查思路 命令行连接mysql 我是安装在本地docker容器中的,可以使用一下命令直接连接 docker exec -it mysqldb mysql -u root -p其中mysqldb是我的mysql容器名字,后面跟随mysql的连接命令,然后输入密码即可。 如果没有设置过密码,…...
Qt 布局(QSplitter 类QDockWidget 类) 总结
一、QSplitter 类(窗口分割) QSplitter类是一个Qt框架提供的基础窗口控件类,用于分割窗口,使得用户可以通过拖动分隔条来调节子窗口的大小。QSplitter在用户界面设计中非常常见,经常用于划分窗口区域,使得程序可以同时显示多个子…...
git-ssh-key协议同步文件
生成秘钥 ssh-keygen -t rsa ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/Beza/.ssh/id_rsa): /c/Users/Beza/.ssh/id_rsa already exists. Overwrite (y/n)? y Enter passphrase (empty for no passphrase): …...
2018-2019 ACM-ICPC, Asia Nanjing Regional Contest G. Pyramid(组合数学 计数)
题目 t(t<1e6)组样例,每次给定一个n(n<1e9),统计边长为n的上述三角形的等边三角形个数 其中等边三角形的三个顶点,可以在所有黑色三角形&白色三角形的顶点中任取, 答案对1e97取模 思路来源 申老师 & oeis A0003…...
C++学习——string 详解(即C++字符串详解)
以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 一、定义string变量的方法 C增强了对字符串的支持,除了可以使用C风格的字符串,还可以使用内置的 string 类。 string是类,而不是基本数据类型。虽…...
LeetCode 1 两数之和
题目描述 链接:https://leetcode.cn/problems/two-sum/?envTypefeatured-list&envId2ckc81c?envTypefeatured-list&envId2ckc81c 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 targ…...
【opencv】windows10下opencv4.8.0-cuda Python版本源码编译教程
【opencv】windows10下opencv4.8.0-cuda Python版本源码编译教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【opencv】windows10下opencv4.8.0-cuda Python版本源码编译教程前言准备工具anaconda/cuda/cudnnanaconda创建环境(选做)安装原…...
【1day】用友U8Cloud未授权访问漏洞学习
注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现...
基于单片机智能汽车仪表设计系统
基于单片机的汽车智能仪表的设计 摘要:汽车的汽车系统。速度测量以及调速是我们这次的设计所要研究的对象,本次设计的基础核心的模块就是单片机,其应用的核心的控制单元就是stc89c52单片机,用到的测速模块是霍尔传感器,…...
java double 保留两位小数
在Java中,你可以使用 DecimalFormat 或 String.format 来保留 double 类型的数字两位小数。以下是两个例子: 使用 DecimalFormat import java.text.DecimalFormat;public class Main {public static void main(String[] args) {double number 123.456…...
计网第六章(应用层)(三)(文件传输协议FTP)
一、基本概念 将某台计算机中的文件通过网络传送到可能相距很远的另一台计算机中即文件传送。 FTP就是因特网上使用得最广泛的文件传送协议。采用客户/服务器方式。 FTP提供交互式的访问,允许客户指明文件的类型和格式(如指明是否使用ASCII码…...
微信小程序canvas画布绘制base64图片并保存图片到相册中
WXML部分: <view class"img_" style"width: 100%;"><canvas type"2d" id"canvasId" style"width: 100%;height: 100%" ></canvas> <button style"margin: auto;width: 70%;marg…...
Hadoop3教程(八):MapReduce中的序列化概述
文章目录 (79)MR序列化概述(80)自定义序列化步骤(81)序列化案例需求分析(82)序列化案例代码参考文献 (79)MR序列化概述 什么是序列化,什么是反序…...
Flash-Attention
这是一篇硬核的优化Transformer的工作。众所周知,Transformer模型的计算量和储存复杂度是 O ( N 2 ) O(N^2) O(N2) 。尽管先前有了大量的优化工作,比如LongFormer、Sparse Transformer、Reformer等等,一定程度上减轻了Transformer的资源消耗…...
发布npm包质量分测试
查询质量分接口 https://registry.npmjs.org/-/v1/search?textcanvas-plus v0.0.1 quality 0.2987 新建文件夹 canvas-plus 执行命令 npm init 生成package.json {"name": "3r/canvas-plus","version": "0.0.1","descript…...
基于适应度相关优化的BP神经网络(分类应用) - 附代码
基于适应度相关优化的BP神经网络(分类应用) - 附代码 文章目录 基于适应度相关优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.适应度相关优化BP神经网络3.1 BP神经网络参数设置3.2 适应度相关算法应用 4…...
复杂网络 | 利用复杂网络预测城市空间流量
文章目录 效果一览文章概述导入必要的包读取时间序列数据,并使用日期做索引将时间序列进行可视化展示取一年的数据进行分析将数据分布进行可视化展示画移动平均图n 代表滑动窗口的大小向前差分法去趋势化线性回归方法去趋势化拟合模型的线性趋势将拟合得到趋势进行可视化detren…...
【1】c++11新特性(稳定性和兼容性)—>原始字面量
在C11中添加了定义原始字符串的字面量,定义方式为:R “xxx(原始字符串)xxx”其中()两边的字符串可以省略。原始字面量R可以直接表示字符串的实际含义,而不需要额外对字符串做转义或连接等操作。 编程过程中,…...
好用的四川企业用工风险咨询生产厂家
行业痛点分析在四川企业用工风险咨询领域,企业面临诸多技术挑战。首先,许多企业虽意识到用工风险的存在,但却不清楚风险具体所在。测试显示,超过七成企业未系统排查过自身用工风险,社保未足额缴纳、合同存在漏洞、规章…...
告别时钟线!用三根线搞定高速传输:MIPI C-PHY硬件连接与编码原理详解
告别时钟线!用三根线搞定高速传输:MIPI C-PHY硬件连接与编码原理详解 在高速数据传输领域,传统并行总线的时钟同步机制已成为提升速率的瓶颈。MIPI联盟推出的C-PHY标准,以革命性的"三线无时钟"架构打破了这一僵局。本文…...
DDR内存RAS技术:原理、实现与优化实践
1. DDR内存RAS技术概述在现代计算架构中,内存子系统承担着数据暂存与高速交换的关键职能。随着DDR4/5内存接口速率突破6400MT/s,以及半导体工艺进入10nm以下节点,内存系统的可靠性(Reliability)、可用性(Av…...
工业仿真软件推荐指南|高解析度、低成本、自主可控的长期之选
在工业数字化与AI融合的当下,选择一款值得长期投入的工业仿真软件,已成为企业研发效率与成本控制的关键。面对市场上众多CAE/CFD软件,如何从“能用”到“好用”,再到“值得长期持有”,需要一套清晰的评估框架。本文将从…...
大模型“读“懂你的秘密:Tokenize分词技术全解析!
本文深入探讨了大模型如何处理文本输入。核心流程为文本经过Tokenize分词,转为token,再映射为token ID并转化为embedding向量。介绍了三种基础分词粒度:按词切、按字符切、按子词切,并详细解析了四种常见tokenizer方法:…...
从 N+1 到 joinedload:理解 SQLAlchemy 关系加载的核心机制
从 N1 到 joinedload:理解 SQLAlchemy 关系加载的核心机制文章摘要 本文围绕 SQLAlchemy 一对多关系加载展开,重点解释 relationship、lazy loading、selectinload、joinedload、N1 问题以及 joinedload 加载集合关系时为什么需要unique()。前言…...
基于OpenClaw的AI智能体脚手架Tradeclaw:构建跨境贸易决策支持系统
1. 项目概述:为跨境贸易打造的AI智能体脚手架如果你正在从事跨境电商或外贸采购,每天面对海量的产品信息、繁杂的供应商数据和模糊的市场信号,感觉像在信息海洋里盲目捕捞,那么Tradeclaw这个项目可能就是为你量身定制的“数字捕手…...
开源免费Web搜索工具openclaw-free-web-search:原理、部署与实战调优
1. 项目概述:一个开源、免费的Web搜索工具最近在折腾一些需要实时信息查询的小项目,比如新闻聚合、舆情监控或者简单的市场调研,发现直接调用商业搜索引擎的API要么有调用限制,要么费用不菲。就在这个当口,我注意到了G…...
云原生测试工具链选型指南:面向测试从业者的专业架构与实践路径
随着云原生技术栈的深度渗透,软件测试领域正经历一场从理念到工具链的深刻变革。面对Kubernetes、微服务、Service Mesh等新型架构带来的动态性、分布性与高频变更挑战,传统的测试工具与方法论已显乏力。对于测试从业者而言,构建或选型一套适…...
从零到一:51单片机蓝牙遥控车实战指南(附避坑要点)
1. 项目背景与准备 作为一个非硬件专业的爱好者,我第一次接触51单片机时完全是一头雾水。记得当时因为特殊原因在家闲着,突发奇想做个蓝牙遥控车玩玩。没想到这个简单的想法,让我踩遍了新手能遇到的所有坑。现在回头看,其实用51单…...
