• Dami 基于事件总线的本地过程调用框架(首次发版)


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

    特点

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

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

    与常见的 EventBus、ApiBean 的区别

    Dami EventBus ApiBean Dami 的情况说明
    广播 发送(send) + 监听(listen)
    以及 Api 模式
    应答 发送并等响应(sendAndResponse) + 监听(listen) + 答复(reply)
    以及 Api 模式
    回调 有+ 有- 发送并等回调(sendAndCallback) + 监听(listen) + 答复(reply)
    耦合 弱- 弱+ 强++

    依赖配置

    <dependency>
        <groupId>org.noeargroupId>
        <artifactId>damiartifactId>
        <version>0.23version>
    dependency>
    

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

    示例

    demo21_send

    //泛型总线风格。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, "world");
        }
    }
    

    demo12_request

    //字符串总线风格。busStr() = bus()
    public class Demo12 {
        static String topic = "demo.hello";
    
        public static void main(String[] args) {
            //监听事件
            Dami.busStr().listen(topic, payload -> {
                System.err.println(payload);
    
                if (payload.isRequest()) {
                    payload.reply("hi!"); // sendAndResponse 只接收第一个
                    payload.reply("* hi nihao!");
                    payload.reply("** hi nihao!");
                }
            });
    
    
            //发送事件
            String rst1 = Dami.busStr().sendAndResponse(topic, "world"); //要求有返回值
            System.out.println(rst1);
    
            Dami.busStr().sendAndCallback(topic, "world", rst2 -> {
                System.out.println(rst2); //callback 不限回调次数
            });
        }
    }
    

    demo31_api

    使用 ioc 适配版本更简便,详情:dami-solon-plugindami-springboot-starter

    //接口风格
    public interface EventUser {
        void onCreated(Long userId, String name);
        Long getUserId(String name);
    }
    
    //通过约定保持与 Sender 相同的接口定义(或者实现 UserEventSender 接口,但会带来依赖关系)
    public class EventUserListenerOfModule1 {
        public void onCreated(Long userId, String name) {
            System.err.println("onCreated: userId=" + userId + ", name=" + name);
        }
    
        public Long getUserId(String name) {
            return Long.valueOf(name.hashCode());
        }
    }
    
    public class Demo31 {
        public static void main(String[] args) {
            //注册监听器
            EventUserListenerOfModule1 userEventListener = new EventUserListenerOfModule1();
            api.registerListener(topicMapping, userEventListener);
    
            //生成发送器
            EventUser eventUser = api.createSender(topicMapping, EventUser.class);
    
            //发送测试
            eventUser.onCreated(1L, "noear");
            Long userId = eventUser.getUserId("dami");
            System.err.println("收到:响应:userId:" + userId);
    
            //注销监听器
            api.unregisterListener(topicMapping, userEventListener);
        }
    }
    

    项目地址

  • 相关阅读:
    [暑假]Vue生命周期-笔记
    java---kruskal算法---最小生成树(2)(每日一道算法2022.9.3)
    英雄算法7月24号
    冰蝎加密 WebShell 过杀软
    Docker镜像仓库
    人民艺术家梁永和丹青传情新时代
    matlab数学建模方法与实践 笔记汇总
    GC垃圾回收算法
    基于SpringBoot的宠物商店管理系统
    WEB安全之PHP安全开发 博客系统(四):文章管理之列表的制作与修改(保存更改)
  • 原文地址:https://www.cnblogs.com/noear/p/17698897.html