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 {
    @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");
    }
}

另一個方案是用重載派發器的方法:

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("結速監視...");
    }
}

疑問:
爲什麼不用分佈式消息隊列呢?不好意思,真的是不同的維度事兒。

項目地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章