<xmp id="63nn9"><video id="63nn9"></video></xmp>

<xmp id="63nn9"></xmp>

<wbr id="63nn9"><ins id="63nn9"></ins></wbr>

<wbr id="63nn9"></wbr><video id="63nn9"><ins id="63nn9"><table id="63nn9"></table></ins></video>

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.noear</groupId>
    <artifactId>dami</artifactId>
    <version>0.23</version>
</dependency>

如果涉及類加載器隔離:請在主程序標為編譯,在其它模塊標為可選。

示例

demo21_send

//泛型總線風格。<C,R>bus()
public class Deom11 {
    static String topic = "demo.hello";

    public static void main(String[] args) {
        //監聽事件
        Dami.<String,Long>bus().listen(topic, payload -> {
            System.err.println(payload); //可以有多個訂閱
        });
        Dami.<String,Long>bus().listen(topic, payload -> {
            CompletableFuture.runAsync(()-> { //也可以異步消費
                System.err.println(payload);
            });
        });


        //發送事件
        Dami.<String,Long>bus().send(topic, "world");
    }
}

demo12_request

//字符串總線風格。busStr() = <String,String>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-plugin、dami-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);
    }
}

項目地址

posted @ 2023-09-13 10:34  帶刺的坐椅  閱讀(225)  評論(0編輯  收藏  舉報
人碰人摸人爱免费视频播放

<xmp id="63nn9"><video id="63nn9"></video></xmp>

<xmp id="63nn9"></xmp>

<wbr id="63nn9"><ins id="63nn9"></ins></wbr>

<wbr id="63nn9"></wbr><video id="63nn9"><ins id="63nn9"><table id="63nn9"></table></ins></video>