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("結速監視...");
}
}
疑問:
爲什麼不用分佈式消息隊列呢?不好意思,真的是不同的維度事兒。