经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
Dami 基于事件总线的本地过程调用框架(首次发版)
来源:cnblogs  作者:带刺的坐椅  时间:2023/9/13 15:37:56  对本文有异议

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

特点

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

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

与常见的 EventBus、ApiBean 的区别

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

依赖配置

  1. <dependency>
  2. <groupId>org.noear</groupId>
  3. <artifactId>dami</artifactId>
  4. <version>0.23</version>
  5. </dependency>

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

示例

demo21_send

  1. //泛型总线风格。<C,R>bus()
  2. public class Deom11 {
  3. static String topic = "demo.hello";
  4. public static void main(String[] args) {
  5. //监听事件
  6. Dami.<String,Long>bus().listen(topic, payload -> {
  7. System.err.println(payload); //可以有多个订阅
  8. });
  9. Dami.<String,Long>bus().listen(topic, payload -> {
  10. CompletableFuture.runAsync(()-> { //也可以异步消费
  11. System.err.println(payload);
  12. });
  13. });
  14. //发送事件
  15. Dami.<String,Long>bus().send(topic, "world");
  16. }
  17. }

demo12_request

  1. //字符串总线风格。busStr() = <String,String>bus()
  2. public class Demo12 {
  3. static String topic = "demo.hello";
  4. public static void main(String[] args) {
  5. //监听事件
  6. Dami.busStr().listen(topic, payload -> {
  7. System.err.println(payload);
  8. if (payload.isRequest()) {
  9. payload.reply("hi!"); // sendAndResponse 只接收第一个
  10. payload.reply("* hi nihao!");
  11. payload.reply("** hi nihao!");
  12. }
  13. });
  14. //发送事件
  15. String rst1 = Dami.busStr().sendAndResponse(topic, "world"); //要求有返回值
  16. System.out.println(rst1);
  17. Dami.busStr().sendAndCallback(topic, "world", rst2 -> {
  18. System.out.println(rst2); //callback 不限回调次数
  19. });
  20. }
  21. }

demo31_api

使用 ioc 适配版本更简便,详情:dami-solon-plugindami-springboot-starter

  1. //接口风格
  2. public interface EventUser {
  3. void onCreated(Long userId, String name);
  4. Long getUserId(String name);
  5. }
  6. //通过约定保持与 Sender 相同的接口定义(或者实现 UserEventSender 接口,但会带来依赖关系)
  7. public class EventUserListenerOfModule1 {
  8. public void onCreated(Long userId, String name) {
  9. System.err.println("onCreated: userId=" + userId + ", name=" + name);
  10. }
  11. public Long getUserId(String name) {
  12. return Long.valueOf(name.hashCode());
  13. }
  14. }
  15. public class Demo31 {
  16. public static void main(String[] args) {
  17. //注册监听器
  18. EventUserListenerOfModule1 userEventListener = new EventUserListenerOfModule1();
  19. api.registerListener(topicMapping, userEventListener);
  20. //生成发送器
  21. EventUser eventUser = api.createSender(topicMapping, EventUser.class);
  22. //发送测试
  23. eventUser.onCreated(1L, "noear");
  24. Long userId = eventUser.getUserId("dami");
  25. System.err.println("收到:响应:userId:" + userId);
  26. //注销监听器
  27. api.unregisterListener(topicMapping, userEventListener);
  28. }
  29. }

项目地址

原文链接:https://www.cnblogs.com/noear/p/17698897.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号