diff --git a/.env.example b/.env.example index 5dc248b..7640ad6 100644 --- a/.env.example +++ b/.env.example @@ -8,7 +8,7 @@ MSGX_MAILBOX_URL=jdbc:mysql://localhost:3306/cdairport?useSSL=false&allowPublicK MSGX_MAILBOX_USER=msgx_dev MSGX_MAILBOX_PASSWORD=msgx_dev_pass -# 2. 自有 PostgreSQL(dev compose: postgres 服务,应用启动设 MSGX_FLYWAY_ENABLED=true 时由 Flyway 自动执行 V1.0.0 与 V1.1.0 迁移) +# 2. 自有 PostgreSQL(dev compose: postgres 服务,应用启动设 MSGX_FLYWAY_ENABLED=true 时由 Flyway 执行 V1 + V2) MSGX_PG_URL=jdbc:postgresql://localhost:5432/msgx MSGX_PG_USER=msgx_dev MSGX_PG_PASSWORD=msgx_dev_pass diff --git a/docs/implementation.md b/docs/implementation.md index ffa7ab8..fd1425d 100644 --- a/docs/implementation.md +++ b/docs/implementation.md @@ -300,7 +300,7 @@ PG 是航班数据源(`INV-5`);Redis 从 PG 同步,处理完成前写入 | 资源明细表 | 保存登机门、值机柜台、转盘、计划机位、滑槽、延误、靠撤桥、轮挡等变长集合;`SRVT`/`VIPF` 专用明细见 `G-SRVT-VIPF`。主键为 `(FLID, ORDINAL)`。 | | `FLIGHT_ROUTE_POINT` | ROUT 与 ERUT 两类路线点,使用 `ROUTE_KIND` 区分;主键应包含该列,避免两类路线的序号冲突。 | | `PROC_STATE` | 信箱消息的处理终态、业务身份幂等记录,以及回填事实(`RECEIVED_AT` / `BACKFILL_*`)。 | -| `MSG_EVENT` | 事务 outbox,承载整态快照、变更通知和删除事件(tombstone)。 | +| `MSG_EVENT` | 事务 outbox,承载整态快照与变更通知;删航班只走 `msg`(`C-9`)。 | | `SCHD_SNAP_LOG` | 日计划处理留痕,只追加、可重建,不参与状态决策。 | ### 11.2 航班身份与运营日 @@ -342,7 +342,7 @@ PG 是航班数据源(`INV-5`);Redis 从 PG 同步,处理完成前写入 - 相同资源号不代表同一条分配,禁止按资源号去重。 - 每次持久化完整航班状态时,明细表按该 `FLID` 先删后插,以完整合并结果为准。 - ROUT 与 ERUT 是两类独立集合,不能因相同序号覆盖彼此。 -- `CHDT` 的类字段固定为 `CCLS`/`CTYP`;当前 wire DTO 与持久化列误写成 `CHCLS`/`CHTYP`,见 `G-FLOP-UNMAPPED`。 +- `CHDT` 的类字段固定为 `CCLS`/`CTYP`(wire DTO 与 `flight_chute` 列 `ccls`/`ctyp` 已对齐;迁移见 `V2__flight_chute_class_type_rename.sql`)。 - 主/共享:`MAID` 指向主航班 `FLID`;`MAFL` 从子航班派生,不入站。 ### 11.4 `MAFL` @@ -395,7 +395,7 @@ PG 是航班数据源(`INV-5`);Redis 从 PG 同步,处理完成前写入 ### 12.3 删除与重建 -FDEL:`ACTIVE→DELETED`,写 tombstone。物理删除仅历史清理成功后(`US-14`、`D1`)。覆盖范围内快照缺席也标删(`INV-7`)。 +FDEL:`ACTIVE→DELETED`,只登记 `KAFKA:msg` 变更通知(`C-9`;不再写 `schd` tombstone)。物理删除仅历史清理成功后(`US-14`、`D1`)。覆盖范围内快照缺席也标删(`INV-7`)。 ADFT:Set-only(`US-04` AC2),未带字段不清。有 `SODT` 则算 `OPERATION_DAY`。 diff --git a/docs/reference.md b/docs/reference.md index f09e920..21a3279 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -137,7 +137,8 @@ | `MALFORMED` | 找不到原文,或 XML、必要字段无效 | 立即记 `DEAD`,停止自动处理 | 否 | | `PROTOCOL` | 整份报文未通过业务校验,或运营日不一致 | 整份不写数据库,记 `DEAD` | 否 | | `CODEC_ERROR` | 解码程序尚不能识别报文结构 | 记 `FAILED`,等待后重试 | 是 | -| `UNSUPPORTED` | 当前没有对应的处理程序 | 当前代码记 `FAILED` 并重试;`US-03` AC2 要求跳过合法未知类型 | 是 | +| `UNSUPPORTED`(合法未知类型) | 报文种类可识别,但没有对应处理程序(`MsgKind.Unsupported`) | 记 `SKIPPED`,写回信箱为已处理(`US-03` AC2) | 否(终态,不进重放白名单) | +| `UNSUPPORTED`(参考数据) | 参考数据类别已识别,但处理器尚未落地(`MsgKind.RefData`) | 记 `FAILED(UNSUPPORTED)` 并重试 | 是 | | `INFRA` | 数据库、网络或程序执行出错 | 记 `FAILED`,等待后重试 | 是 | | `EXHAUSTED` | 自动重试次数已用尽 | 记 `DEAD`;原错误类别被覆盖,原因留在 `LAST_ERROR` | 是 | diff --git a/src/main/kotlin/com/gzzn/omms/msgexchange/domain/MsgEvent.kt b/src/main/kotlin/com/gzzn/omms/msgexchange/domain/MsgEvent.kt index e602eb8..bc8fbb7 100644 --- a/src/main/kotlin/com/gzzn/omms/msgexchange/domain/MsgEvent.kt +++ b/src/main/kotlin/com/gzzn/omms/msgexchange/domain/MsgEvent.kt @@ -1,6 +1,9 @@ package com.gzzn.omms.msgexchange.domain -/** 事件的两种形态:UPSERT 是新增或更新(可能是整态也可能是变化通知),TOMBSTONE 是删除。 */ +/** + * 事件形态。生产路径只写 [UPSERT]:删除通知也走 `KAFKA:msg` 的 UPSERT 变更(`C-9`)。 + * [TOMBSTONE] 仍保留在枚举与投递分支里,当前无生产写入方(待 `Q5` 定稿清理或保留)。 + */ enum class EventType { UPSERT, TOMBSTONE } /** 投递状态:PENDING 待发 → SENT 已发出;发送失败按退避重试,重试次数用尽转 DEAD,留在表里当死信队列。 */ @@ -11,8 +14,8 @@ enum class EventStatus { PENDING, SENT, DEAD } * * 写业务数据时在同一个事务里往这里插一行,投递线程随后按行发出,这样业务提交和"该发的事件" * 不会脱节。KAFKA_SCHD 发完整状态,KAFKA_MSG 只发"这个航班变了"的通知;两个主题之间不保证 - * 先后顺序。TOMBSTONE 只在两种情况下登记:航班从在用变成删除,或者被生命周期清理前补发 - * 一次删除通知。见 docs/implementation.md「Kafka 与读取」。 + * 先后顺序。删航班只登记 `KAFKA:msg`(`C-9`),不再写 schd tombstone。见 + * docs/implementation.md「Kafka 与读取」。 * * stateVersion 是发布时的航班版本号;同一 FLID 攒了多条待发事件时,只发版本号最新的那条。 */ diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 2a79e14..80a3881 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -47,8 +47,8 @@ micronaut: # 管理端点(U03/N32):/env、/beans 默认 sensitive;仅开发/影子环境放开——见 application-dev.yml # 自有 PostgreSQL:全部内部状态(PIPELINE_LOCK/PROC_STATE/MSG_EVENT/REQ_TRACK/INBOX_CURSOR/ -# FLIGHT_SCHD 及明细表/SCHD_SNAP_LOG;迁移为单基线 db/migration/V1__flight_state_baseline.sql, -# 原 V2–V10 的净结构已合并其中,回填事实与处理终态同表同行)。 +# FLIGHT_SCHD 及明细表/SCHD_SNAP_LOG;迁移链:V1__flight_state_baseline.sql(原多版净结构合并) +# + V2__flight_chute_class_type_rename.sql(chute 类字段 CCLS/CTYP);回填事实与处理终态同表同行)。 # 数据层实装前 enabled=false(stub 模式不建连)。 datasources: default: