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