作者热门文章
- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
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);
}
}
最后此篇关于Dami基于事件总线的本地过程调用框架(首次发版)的文章就讲到这里了,如果你想了解更多关于Dami基于事件总线的本地过程调用框架(首次发版)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我创建了一个包含字典的文件,其中包含用西类牙语编写的数据(即 Damián 等): fileNameX.write(json.dumps(dictionaryX, indent=4)) 数据来自一些f
我是一名优秀的程序员,十分优秀!