Files
msgexchange-v2/src/main/kotlin/com/gzzn/omms/msgexchange/domain/MsgEvent.kt
T
windyboy 8a380c7646 refactor(config): drop system-time defaults from domain and entry points
删除会被误用的系统时间默认值:MsgEvent.createdAt、ProcState.updatedAt、InboxPoller.pollOnce(now)、HistorySweepJob.run(now)、Identity.of(day)。Identity 的日期边界改由 MessageProcessor 按 PARAM:msgx.operation-day.zone 算出后传入(边界关闭时身份值不变);StubProcState/StubInbox 改注入 Clock(测试可传假时钟),全部调用点显式传时间。

验证:./gradlew test 145 tests / 0 fail / 0 skipped。
2026-09-12 20:56:41 +08:00

33 lines
1.6 KiB
Kotlin

package com.gzzn.omms.msgexchange.domain
/** 事件的两种形态:UPSERT 是新增或更新(可能是整态也可能是变化通知),TOMBSTONE 是删除。 */
enum class EventType { UPSERT, TOMBSTONE }
/** 投递状态:PENDING 待发 → SENT 已发出;发送失败按退避重试,重试次数用尽转 DEAD,留在表里当死信队列。 */
enum class EventStatus { PENDING, SENT, DEAD }
/**
* MSG_EVENT:一张待发事件表(outbox),记录航班状态变更要对外发什么。
*
* 写业务数据时在同一个事务里往这里插一行,投递线程随后按行发出,这样业务提交和"该发的事件"
* 不会脱节。KAFKA_SCHD 发完整状态,KAFKA_MSG 只发"这个航班变了"的通知;两个主题之间不保证
* 先后顺序。TOMBSTONE 只在两种情况下登记:航班从在用变成删除,或者被生命周期清理前补发
* 一次删除通知。见 docs/flight-state.md §5。
*
* stateVersion 是发布时的航班版本号;同一 FLID 攒了多条待发事件时,只发版本号最新的那条。
*/
data class MsgEvent(
val eventId: Long? = null,
val target: String,
val partitionKey: String, // 分区键,恒为 FLID(航班实例 ID)
val eventType: EventType = EventType.UPSERT,
val stateVersion: Long = 0,
val payloadJson: String,
val state: EventStatus = EventStatus.PENDING,
val attempts: Int = 0,
val nextAttemptAt: java.time.Instant? = null,
val errorClass: ErrorClass? = null,
val lastError: String? = null,
val createdAt: java.time.Instant,
)