Java

Bus-Abstract 模块 — 开发者手册

Euonia 消息总线的抽象契约层,定义了消息传输、分发、约定分类、策略路由和接收者注册的核心接口。该模块不包含任何具体传输实现,而是为 bus-core(编排层)和各传输适配器提供统一的扩展点。
  • Maven 坐标: com.euonia:bus-abstract
  • 依赖: com.euonia:core
  • API文档点击查看

架构

                        ┌─────────────────────────┐
                        │      Configurator         │  ← 全局约定、策略、处理器注册
                        └────────────┬────────────┘
                                     │
          ┌──────────────────────────┼──────────────────────────┐
          │                          │                          │
          ▼                          ▼                          ▼
┌─────────────────┐     ┌─────────────────────┐     ┌─────────────────────┐
│ MessageConvention│     │  TransportStrategy   │     │  HandlerRegistration │
│  (消息分类)       │     │  (传输策略路由)       │     │  (处理器元数据)       │
│                  │     │                      │     │                      │
│ unicast/multicast│     │ outgoing / incoming  │     │ channel + type       │
│ /request         │     │ local / distributed  │     │ + method             │
└────────┬────────┘     └──────────┬───────────┘     └─────────────────────┘
         │                         │
         ▼                         ▼
┌─────────────────┐     ┌─────────────────────┐
│    Dispatcher    │────▶│     Transport        │  ← publishAsync / sendAsync / requestAsync
│ (选择传输通道)    │     │   (抽象传输契约)      │
└─────────────────┘     └─────────────────────┘

                         ┌─────────────────────┐
                         │   RecipientRegistrar │  ← 将 HandlerRegistration 绑定到传输
                         └─────────────────────┘
                                     │
                          ┌──────────┴──────────┐
                          ▼                     ▼
                   ┌────────────┐       ┌────────────┐
                   │  Subscriber │       │  Executor   │
                   │ (多播接收者) │       │(单播/请求接收)│
                   └────────────┘       └────────────┘

Bus-Abstract 是契约层,提供三类核心抽象:约定(消息怎么投)、策略(走哪条通道)、传输(具体投递)。各传输适配器实现 TransportRecipientRegistrar 等接口。


核心概念

约定(Convention)—— 消息类型分类

消息约定决定消息的投递语义:单播多播还是请求-响应。支持两种分类方式:

分类方式 实现 说明
接口标记 DefaultMessageConvention 消息类实现 UnicastMulticastRequest<R> 接口
注解标记 AnnotationMessageConvention 消息类标注 @Unicast@Multicast@Request 注解
// 方式一:接口标记
public class CreateOrderCommand implements Unicast { ... }
public class OrderCreatedEvent implements Multicast { ... }
public class GetOrderQuery implements Request<OrderDto> { ... }

// 方式二:注解标记
@Unicast
public class CreateOrderCommand { ... }
@Multicast
public class OrderCreatedEvent { ... }
@Request(responseType = OrderDto.class)
public class GetOrderQuery { ... }
类 / 接口 描述
MessageConvention 分类契约接口:isUnicast(String)isMulticast(String)isRequest(String)
MessageConventionBuilder 流式构建器,聚合多个约定实例
MessageConventionType 枚举:NONEUNICASTMULTICASTREQUEST

策略(Strategy)—— 传输路由

传输策略决定消息的出站/入站传输选择。与约定正交:约定决定"怎么投",策略决定"走哪条通道"。

类 / 接口 描述
TransportStrategy 策略契约:outgoing() / incoming() 返回消息类型匹配的传输名
TransportStrategyBuilder 流式构建器

相关注解驱动策略:

注解 说明
@DispatchIn 指定出站传输通道
@ReceiveIn 指定入站传输通道
@LocalMessage 标记本地传输消息
@DistributedMessage 标记分布式传输消息

传输(Transport)—— 抽象契约

Transport 接口是所有传输适配器的契约,bus-core.MessageBus 通过它完成实际的消息投递。

方法 说明
getName() 返回传输名称(如 "inmemory""rabbitmq""kafka"
publishAsync(RoutedMessage) 发布/多播消息
sendAsync(RoutedMessage) 单播消息(无响应)
sendAsync(RoutedMessage, Class<R>) 单播消息,返回 CompletableFuture<R>
requestAsync(RoutedMessage, Class<R>) 请求-响应,返回 CompletableFuture<R>

消息信封(Envelope)

类 / 接口 描述
MessageEnvelope 信封接口:messageIdcorrelationIdconversationIdrequestTrackIdchannel
MessageHeaders 消息头常量
MessageMetadata 可扩展的元数据 Map,带类型化读取方法

处理上下文(Context)

类 / 接口 描述
MessageContext 处理上下文抽象 — 提供消息访问、响应发送、失败通知、完成回调
MessageContextBase 默认实现 — 基于 SubmissionPublisher 的响应事件流

分发与注册

类 / 接口 描述
Dispatcher 消息类型 → 传输名称的决策接口
HandlerContext 处理器上下文 — 管理消息订阅监听器
Configurator 全局配置接口 — 暴露约定构建器、策略构建器、处理器注册列表
RecipientRegistrar 接收者注册器 — 将 HandlerRegistration 列表绑定到具体传输

接收者角色

接口 说明
Recipient 接收者基类(继承 AutoCloseable
Consumer 通用消费者标记接口
Subscriber 多播接收者 — 用于 Multicast 消息
Executor 单播/请求接收者 — 用于 UnicastRequest 消息

事件体系

描述
MessageProcessedEvent 基础事件 — 包含消息、上下文、处理类型
MessageDeliveredEvent 消息已投递
MessageReceivedEvent 消息已接收
MessageAcknowledgedEvent 消息已确认
MessageRepliedEvent 消息已回复 — 包含响应载荷
MessageHandledEvent 消息已处理 — 包含处理器类型
MessageSubscribedEvent 订阅元数据
MessageProcessType 处理类型枚举:SENDDELIVEREDRECEIVEDACKNOWLEDGEDREPLIEDHANDLED

异常层次

异常类 说明
ChannelNotRegisterException 通道未注册异常
MessageConventionException 消息约定异常
MessageDeliverException 消息投递失败
MessageProcessingException 消息处理失败
MessageTransportException 传输层错误
MessagePersistentException 消息持久化失败
MessageTypeException 无效/未分类的消息类型

@Subscribe — 消息处理器标记

@Subscribe(channel = "orders", group = "order-processor")
public void handleOrderCreated(OrderCreatedEvent event) {
    // 处理订单创建事件
}

收件箱与发件箱

模式 接口 说明
Inbox InboxStoreInboxEntryInboxHandle 幂等消费,防止重复处理
Outbox OutboxStoreOutboxEntryOutboxTransport 事务发件,确保消息与业务状态一致
DLQ DeadLetterMessage 死信队列,处理失败消息

与其他模块的关系

bus-abstract  (本模块 — 契约层)
    │
    ├──▶ bus-core      (编排层)   — 实现 Configurator、Dispatcher、HandlerContext;
    │                                MessageBus 使用 Transport、RoutedMessage、异常等
    │
    ├──▶ bus-inmemory  (传输适配器) — 实现 Transport、RecipientRegistrar、Subscriber、Executor
    ├──▶ bus-rabbitmq  (传输适配器) — 实现 Transport(骨架)
    └──▶ bus-kafka     (传输适配器) — 依赖声明,待实现

快速入门

添加依赖

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

定义消息类型(接口方式)

import com.euonia.bus.message.Unicast;
import com.euonia.bus.message.Multicast;
import com.euonia.bus.message.Request;

// 单播命令
public class CreateOrderCommand implements Unicast {
    private String orderId;
}

// 多播事件
public class OrderCreatedEvent implements Multicast {
    private String orderId;
}

// 请求-响应
public class GetOrderQuery implements Request<OrderDto> {
    private String orderId;
}

定义消息类型(注解方式)

import com.euonia.bus.annotation.*;

@Unicast
@Channel("orders")
@DispatchIn(transports = {"rabbitmq"})
public class CreateOrderCommand { ... }

@Multicast
@DistributedMessage
public class OrderCreatedEvent { ... }

配置消息约定与策略

import com.euonia.bus.convention.*;
import com.euonia.bus.strategy.*;

// 构建消息约定
MessageConvention convention = new MessageConventionBuilder()
    .add(new DefaultMessageConvention())       // 接口标记
    .add(new AnnotationMessageConvention())     // 注解标记
    .getConvention();

// 构建传输策略
TransportStrategy strategy = new TransportStrategyBuilder()
    .add(new AnnotationTransportStrategy())
    .add(new LocalMessageTransportStrategy())
    .add(new DistributedMessageTransportStrategy())
    .getStrategy();

// 判断消息类型
boolean isUnicast = convention.isUnicast("orders");     // true
boolean isMulticast = convention.isMulticast("events");  // true
boolean isRequest = convention.isRequest("queries");     // true

设计模式

模式 应用
策略模式 MessageConventionTransportStrategy 的多种实现
组合模式 约定和策略构建器聚合多个求值器
构建器模式 MessageConventionBuilderTransportStrategyBuilder
装饰器模式 可覆写约定/策略包装器
标记接口 / 标记注解 双通道消息分类(Unicast / @Unicast
观察者模式 MessageContextBase 通过 SubmissionPublisher 发布事件
信封模式 RoutedMessage 携带载荷和传输元数据
注册表模式 Configurator 存储策略构建器和处理器注册

API 参考

导出包总览

包名 类数 说明
com.euonia.bus.annotation 10 消息分类、路由和订阅的注解
com.euonia.bus.convention 3 消息约定分类
com.euonia.bus.strategy 2 传输策略路由
com.euonia.bus 11 核心抽象:传输、分发、上下文、信封
com.euonia.bus.message 4 消息分类标记接口
com.euonia.bus.event 8 消息处理事件体系
com.euonia.bus.exception 7 异常层次
com.euonia.bus.recipient 5 消息接收者角色
com.euonia.bus.consistency 6 收件箱/发件箱模式抽象
com.euonia.bus.dlq 1 死信队列
com.euonia.bus.serialization 1 序列化契约
完整的 API 类级文档见 apis.md 及各独立类文档。

Maven

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

依赖

  • com.euonia:core (compile)
  • org.junit.jupiter:junit-jupiter (test)
  • org.assertj:assertj-core (test)