DamiBus v1.1.0 发布(给单体多模块解耦)

DamiBus,专为单体多模块之间通讯解耦而设计(尤其是未知模块、隔离模块、领域模块)。零依赖。

特点

结合 Bus 与 RPC 的概念,可作事件分发,可作接口调用。

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

与常见的 EventBus、ApiBean 的区别

DamiBus EventBus Api DamiBus 的情况说明
广播 有 有 无 发送(send) + 监听(listen) 以及 Api 模式
应答 有 无 有 调用(call) + 监听(listen) + 答复(reply) 以及 Api 模式
耦合 弱- 弱+ 强++

如果涉及类加载器隔离:请在主程序标为编译,在其它模块标为可选。

本次更新了什么?

新版本简化了体验!

  • 调整 DamiBus:sendAndSubscribe 标为弃用
  • 调整 DamiBus:sendAndRequest 标为弃用(由 call 替代)
  • 调整 Payload:isSubscribe 标为弃用
  • 调整 Payload:isRequest 标为弃用(由 requiredReply 替代)
  • 添加 DamiBus:call 方法,意为调用(要求有一个答复)
  • 添加 Payload:requiredReply 方法,意为要求答复(或必须答复)

性能测试?

瞬发 1000万个事件,1秒左右可发完(基于 jdk11 测试):

java 复制代码
public class SendTest {
    static Integer count = 0;

    public static void main(String[] args) {
        Dami.bus().listen("test.demo", e -> { count = count + 1; });

        long start = System.currentTimeMillis();
        for (int i = 0; i < 10_000_000; i++) {
            Dami.bus().send("test.demo", "1");
        }
        System.out.println(System.currentTimeMillis() - start + "::" + count);
    }
}

疑问:

为什么不用分布式消息队列呢?定位不同(侧重,单体多模块解耦)。

示例

demo21_send

java 复制代码
//总线风格。bus()
public class Deom11 {
    static String topic = "demo.hello";

    public static void main(String[] args) {
        //监听事件
        Dami.bus().listen(topic, payload -> {
            System.err.println(payload); //可以有多个订阅
        });
        Dami.bus().listen(topic, payload -> {
            CompletableFuture.runAsync(()-> { //也可以异步消费
                System.err.println(payload);
            });
        });


        //发送事件
        Dami.bus().send(topic, "{name:'noear',say:'hello'}");
    }
}

demo12_call

java 复制代码
//泛型总线风格。<C,R>bus()
public class Demo12 {
    static String topic = "demo.hello";

    public static void main(String[] args) {
        //监听事件
        Dami.<String,String>bus().listen(topic, payload -> {
            System.err.println(payload);

            if (payload.requiredReply()) {
                payload.reply("hi!"); 
            }
        });


        //发送事件 //要求有答复(即,返回值)
        String rst1 = Dami.<String,String>bus().call(topic, "world"); 
        //发送事件 //要求有答复(即,返回值) //支持默认值(没有订阅时触发)
        //String rst1 = Dami.<String,String>bus().call(topic, "world", ()->"demo"); 
        System.out.println(rst1);
    }
}

项目地址

相关推荐
驭渊的小故事5 小时前
MyBatis XML 开发实战:从配置到 CRUD 全解析
xml·java·mybatis
哦虎!10 小时前
【JavaEE】网络初识
java
for_ever_love__11 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
我是人✓11 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
欣栀♡12 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
IT研究室12 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项12 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog12 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友
秋饼13 小时前
Spring AI 2.0 结构化输出企业级实战:从 BeanOutputConverter 源码到生产级解析容错
java·ai·技术分享·后端开发
摇滚侠13 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记