Dami,專為本地多模組之間通訊解耦而設計(尤其是未知模組、隔離模組、領域模組)。零依賴,特適合 DDD。
結合 Bus 與 RPC 的概念,可作事件分發,可作介面呼叫,可作非同步響應。
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>
如果涉及類載入器隔離:請在主程式標為編譯,在其它模組標為可選。
//泛型匯流排風格。<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");
}
}
//字串匯流排風格。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 不限回撥次數
});
}
}
使用 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);
}
}