Java

Bus-InMemory 模块 — 开发者手册

Euonia 消息总线的进程内传输适配器。基于 bus-abstract 的抽象契约,提供无外部中间件的纯内存消息传递实现,适用于开发测试、单进程集成以及需要超低延迟的场景。
  • Maven 坐标: com.euonia:bus-inmemory
  • 依赖: com.euonia:core, com.euonia:pipeline, com.euonia:bus-abstract, com.euonia:bus-core
  • API文档点击查看

架构

                          InMemoryTransport
                    (实现 Transport 接口)
                                  │
                    ┌─────────────┼─────────────┐
                    │             │             │
                    ▼             ▼             ▼
            publishAsync    sendAsync     requestAsync
            (WeakRef 发送)  (StrongRef)   (sendAsync 包装)
                    │             │             │
                    └─────────────┼─────────────┘
                                  │
                                  ▼
                    ┌─────────────────────────┐
                    │       MessagePack        │
                    │  RoutedMessage + Context  │
                    └────────────┬────────────┘
                                 │
                    ┌────────────┴────────────┐
                    │                         │
                    ▼                         ▼
      ┌──────────────────────┐    ┌──────────────────────┐
      │ StrongReferenceMess. │    │ WeakReferenceMess.    │
      │  (单播 / 请求-响应)    │    │  (多播 / 发布-订阅)     │
      └──────────┬───────────┘    └──────────┬───────────┘
                 │                           │
                 ▼                           ▼
         InMemoryRecipient            InMemoryRecipient
                 │                           │
    ┌────────────┼────────────┐    ┌─────────┼─────────┐
    ▼            ▼            ▼    ▼         ▼         ▼
UnicastRec.  RequestRec.   MulticastRecipient
(Executor)  (Executor)     (Subscriber)

核心概念

InMemoryTransport — 进程内传输实现

实现 Transport 接口,是整个模块的入口点。

方法 信使 异步模型
publishAsync WeakReferenceMessenger 发送后立即返回已完成 Future
sendAsync StrongReferenceMessenger 等待 context.onRepliedcomplete 事件
sendAsync(message, Class<R>) StrongReferenceMessenger 从 reply 事件载荷转型为 R
requestAsync StrongReferenceMessenger 委托给 sendAsync(message, Object.class)

投递流程: 1. 从 RoutedMessage 创建 MessageContextBase 2. 包装为 MessagePack(message + context + aborted 标志) 3. 通过对应信使发送至目标通道 4. 触发 MessageDeliveredEvent 监听器

信使引擎

信使 引用类型 用途 注册结构
StrongReferenceMessenger 强引用 Unicast、Request ConcurrentMap<Class<?>, Map<String, Map<RecipientKey, Dispatcher>>>
WeakReferenceMessenger 弱引用 Multicast 同上,但使用 WeakReference 包装的 WeakKey

WeakReferenceMessenger 特性: - GC 语义:接收者无人持有强引用时自动退订 - 发送时跳过已被 GC 回收的接收者 - cleanup:扫描并移除已回收接收者的所有注册

InMemoryRecipient — 接收者基类

接收流水线:

receive(MessagePack)
  ├── 提取 RoutedMessage + MessageContext
  ├── 触发 MessageReceivedEvent
  ├── 调用 handleAsync(channel, payload, context, aborted)
  └── 触发 MessageAcknowledgedEvent

接收者注册映射

消息类型 接收者 信使
Unicast InMemoryUnicastRecipient StrongReferenceMessenger
Multicast InMemoryMulticastRecipient WeakReferenceMessenger
Request InMemoryRequestRecipient StrongReferenceMessenger

快速入门

// 创建进程内传输
var transport = new InMemoryTransport(handlerContext);
transport.setConfigurator(configurator);

// 发送消息
transport.sendAsync(routedMessage)
    .toCompletableFuture()
    .join();

// 发布多播消息
transport.publishAsync(routedMessage)
    .toCompletableFuture()
    .join();

Maven

<dependency>
    <groupId>com.euonia</groupId>
    <artifactId>bus-inmemory</artifactId>
    <version>${euonia.version}</version>
</dependency>

作者

damon (zhaorong@outlook.com)