Files
baiyue-firstleg/common-event-contract/src/main/java/com/baiyue/common/event/EventEnvelope.java
T
2026-07-30 18:01:36 +08:00

56 lines
2.0 KiB
Java

package com.baiyue.common.event;
import com.fasterxml.jackson.databind.JsonNode;
import java.time.Instant;
/**
* 跨服务和跨区域传输使用的不可变事件信封。
*
* <p>租户 ID 和聚合 ID 使用字符串,避免跨语言传输时发生大整数精度丢失。
* {@code payloadHash} 是原始规范化负载字节的 SHA-256 摘要。</p>
*
* @param eventId 事件全局唯一 ID,使用标准 UUID 或 26 位 ULID
* @param eventType 事件类型,不包含版本号
* @param eventVersion 事件契约版本,从 1 开始
* @param occurredAt 业务事实实际发生时间,使用 UTC 时间点
* @param sourceRegion 事件来源业务单元
* @param targetRegion 事件目标业务单元;国内一期允许与来源区域相同
* @param tenantId 事件所属客户租户 ID
* @param aggregateType 聚合类型
* @param aggregateId 聚合 ID
* @param aggregateVersion 聚合版本,用于阻止乱序事件覆盖新状态
* @param handoverVersion 跨区交接版本;非交接事件可为空
* @param traceId 分布式链路 ID
* @param correlationId 同一业务流程的关联 ID
* @param causationId 直接触发当前事件的上游事件 ID;根事件可为空
* @param payload 事件业务负载
* @param payloadHash 负载摘要,格式为 sha256 加冒号和 64 位十六进制字符
*/
public record EventEnvelope(
String eventId,
String eventType,
int eventVersion,
Instant occurredAt,
RegionCode sourceRegion,
RegionCode targetRegion,
String tenantId,
String aggregateType,
String aggregateId,
long aggregateVersion,
Long handoverVersion,
String traceId,
String correlationId,
String causationId,
JsonNode payload,
String payloadHash
) {
/**
* 校验事件信封,不符合基础契约时抛出异常。
*/
public EventEnvelope requireValid() {
EventEnvelopeValidator.requireValid(this);
return this;
}
}