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


多元共进|2023 Google 开发者大会精彩演讲回顾

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

特点

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

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

与常见的 EventBus、ApiBean 的区别

  Dami EventBus ApiBean Dami 的情况说明
广播 发送(send) + 监听(listen)
以及 Api 模式
应答 发送并等响应(sendAndResponse) + 监听(listen) + 答复(reply)
以及 Api 模式
回调 有+ 有- 发送并等回调(sendAndCallback) + 监听(listen) + 答复(reply)
耦合 弱- 弱+ 强++  

依赖配置

<dependency>
<groupId>org.noear</groupId>
<artifactId>dami</artifactId>
<version>0.21</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().reply(payload, "hi nihao!"); // sendAndResponse 只接收第一个
Dami.busStr().reply(payload, "* hi nihao!");
Dami.busStr().reply(payload, "** hi nihao!");
}
});


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

Dami.busStr().sendAndCallback(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);
}
}

相關推薦

2023-09-17

Wood,微型 Java ORM 框架(支持:java sql,xml sql,annotation sql;事务;缓存;监控;等...),零依赖! 特点和理念: 跨平台:可以嵌入到JVM脚本引擎(js, groovy, lua, python, ruby)及GraalVM支持的部分语言。 很小巧:0.2Mb(且是功

2023-12-13

1.6.2 性能测试? 瞬发 1000万个事件,1秒左右可发完(基于 jdk11 测试): public class SendTest { static Integer count = 0; public static void main(String[] args) { Dami.bus().listen("test.demo", e -> { count = count + 1; }); long start = System.currentTimeMillis();

2023-09-28

排序支持 TopicRouterPatterned 分离路由能力,可定制 增加基于 Tag 的路由模式定制 增加 @DamiTopic:index 注解属性 dami-springboot-starter,增加 spronboot 2.0 的兼容 修复 dami-springboot-starter 实现类被代理后不能正常注册与注销的问题

2023-10-15

马上可以知道是否有订阅目标) 新增加的监视效果,基于拦截器: public class Demo16_intercept { @Test public void main() throws Exception { Dami.bus().intercept((payload, chain) -> { System.out.println("开始监视..."); if (chain.getTargets().size() == 0) { System

2023-09-23

零依赖,特适合 DDD。 特点 结合 Bus 与 RPC 的概念,可作事件分发,可作接口调用,可作异步响应。 支持事务传导(同步分发、异常透传) 支持事件标识、拦截器(方便跟踪) 支持监听者排序、附件传递(多监听时,可

2023-10-24

域模块)。零依赖。 特点 结合 Bus 与 RPC 的概念,可作事件分发,可作接口调用,可作响应订阅。 支持事务传导(同步分发、异常透传) 支持事件标识、拦截器(方便跟踪) 支持监听者排序、附件传递(多监听时,可

2023-04-08

型,提供了应用程序必备的组件和运行机制。开发者可以基于该模型进行复杂应用开发,使应用开发更简单、高效。 以类形式提供组件开发,方便开发者基于类扩展。 进程内共享虚拟机实例,减少应用内存占用。 支持在

2024-08-27

会生成错误的信息,产生幻觉。如果将大模型直接部署在本地使用,对于一些需要保证信息的实时性、安全性和准确性的用户会失去作用。因此必须使用附加方法增强大模型在真实生产环境中的性能。 针对上述大模型的局限性

2024-06-22

前的 A-1 和 A-2 下线,从而实现了无感知的更新。 开发者基于 ioGame 编写的项目模块,通常是条理清晰的,得益于框架对路由的合理设计,同时也为路由提供了优雅的访问权限控制。当我们整理好这些模块后,对于其他开发者接

2023-11-06

同步的通道。系统会根据数据量大小自动选择蓝牙通道或基于Wi-Fi的P2P通道进行数据的同步。 支持系统应用通过数据管理服务代理静默访问其他系统应用的DataShareExtension数据,即不拉起DataShareExtension所在的应用即可访问应用Da

2023-04-29

档 [新增] Jwt 身份验证过程监听文档 [新增] 事件总线 Redis 集成文档 [更新] 粘土对象文档、虚拟文件系统文档、序列化文档、事件总线文档、远程请求、数据加密文档、安全授权文档、动态 WebAPI 文档

2023-01-19

AFNetworking 是一个适用于苹果旗下多个操作系统网络框架(iOS、macOS、watchOS 和 tvOS ),是开发中不可缺少的组件之一。 它建立在 Foundation URL Loading System 之上,扩展了 Cocoa 中内置的强大的高级网络抽象。它有一个模块化的架构,

2023-05-10

档 [新增] Jwt 身份验证过程监听文档 [新增] 事件总线 Redis 集成文档 [更新] 粘土对象文档、虚拟文件系统文档、序列化文档、事件总线文档、远程请求、数据加密文档、安全授权文档、动态 WebAPI 文档

2024-06-22

数据管理 Preferences支持可序列化为JSON的Object类型,及基于key的精准订阅。 relational_store支持TS同步接口。 UDMF支持批量事务,新增4种常用数据结构标准化定义,40种UTD数据类型。 data_share 在资源占用、访问控制、访问