删除会被误用的系统时间默认值: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。
33 lines
1.6 KiB
Kotlin
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,
|
|
)
|