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

337次阅读
没有评论

多元共进|2023
Google 开发者大会 精彩演讲回顾
Dami 基于事件总线的本地过程调用框架(首次发版)

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

特点

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

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

与常见的 EventBus、ApiBean 的区别

 
Dami
EventBus
ApiBean
Dami 的情况说明

广播



发送(send)+ 监听(listen)
以及 Api 模式

应答



请求并等响应(requestAndResponse)+ 响应(response)
以及 Api 模式

回调
有+

有-
请求并等回调(requestAndCallback)+ 响应(response)

耦合
弱-
弱+
强++
 

依赖配置

<dependency>
<groupId>org.noear</groupId>
<artifactId>dami</artifactId>
<version>0.20.2</version>
</dependency>

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

示例

demo21_send

public class Deom11 {
static String topic = “demo.hello”;

public static void main(String[] args) {
//监听事件
Dami.<String,String>bus().listen(topic, payload -> {
System.err.println(payload);
});

//发送事件
Dami.<String,String>bus().send(topic, “world”);
}
}

demo12_request

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()) {
Dami.busStr().response(payload, “hi nihao!”); // requestAndResponse 只接收第一个
Dami.busStr().response(payload, “* hi nihao!”);
Dami.busStr().response(payload, “** hi nihao!”);
}
});

//发送事件
String rst1 = Dami.busStr().requestAndResponse(topic, “world”);
System.out.println(rst1);

Dami.busStr().requestAndCallback(topic, “world”, rst2 -> {
System.out.println(rst2); //callback 可不限返回
});
}
}

demo31_api

public interface UserEventSender {
void onCreated(Long userId, String name);
Long getUserId(String name);
}

public class UserEventListenerImpl {
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) {
//注册监听器
UserEventListenerOfModule1 userEventListener = new UserEventListenerOfModule1();
Dami.api().registerListener(“demo.user”, userEventListener);

//生成发送器
UserEventSender userEventSender = Dami.api().createSender(“demo.user”, UserEventSender.class);

//发送测试
userEventSender.onCreated(1L, “noear”);
Long userId = userEventSender.getUserId( “dami”);
System.err.println(“收到:响应:userId:” + userId);

//注销监听器
Dami.api().unregisterListener(“demo.user”, userEventListener);
}
}

Read More 

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 
评论(没有评论)
Generated by Feedzy