• DamiBus v0.51 发布


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

    特点

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

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

    与常见的 EventBus、ApiBean 的区别

    DamiBusEventBusApiDamiBus 的情况说明
    广播发送(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");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    另一个方案是用重载派发器的方法:

    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("结速监视...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

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

    项目地址

    • https://gitee.com/noear/dami
    • https://github.com/noear/dami
  • 相关阅读:
    MySQL学习笔记(十二)锁
    Spring 中如何为Bean注入集合呢?
    C语言中最难啃的硬骨头非这三个莫属
    SpringBoot运维实用篇
    【网安】网络安全防止个人信息泄露
    【数学模拟卷总结】2023李林六套卷数学二第一套
    年仅 16 岁的黑客少年,竟是搅乱 IT 巨头的幕后主使?
    【牛客-算法】NC61 两数之和(哈希表的运用,C++)
    MPX 小程序框架 - Tracy 小笔记
    内聚:从低到高衡量一个模块内部各个元素彼此结合的紧密程度,分别是偶然、 时间、 过程 、通信、 顺序、 功能内聚
  • 原文地址:https://blog.csdn.net/cwzb/article/details/133846879