fix(processing): 落地 D1/D5/D6 三项裁决,删除 head-deadline 参数
D5(终态判据只保留尝试上限): - Pump.tick 内联 attempts 判定,删除 head-deadline 相关的毒丸分支与滞留告警代码 - 删除配置项 head-deadline(PipelineProps / application.yml)与 PumpDeadlineTest - PROCESSING_STARTED_AT 变为只写,注释如实说明当前无判据消费它 D1(回填放弃判据改为时间): - 暂时性故障在 R 之前只退避重试,不再按尝试次数放弃;到 R 才放弃并记 TRANSIENT_DEADLINE - backfill-max-attempts 降级为单行重试的告警阈值 D6(超期判据改用本地入队时间): - 新增 V6 迁移:PROC_STATE 加 ENQUEUED_AT(回填存量后置为非空 + 默认) - findBackfillDue 的谓词与 overdue 标记改比较 enqueued_at,不再用库方时钟的 received_at - BackfillDue 增加 overdue;收报与兼容入口显式写入本地入队时间 文档同步: - 清理 4 处 message-lifecycle.md 章节号死链(Pump/InboxService/PipelineProps/application.yml) - 关闭 G-HEAD-DEADLINE、G-BACKFILL-ABANDON-BYTIME、G-ENQUEUED-AT 三条缺口登记 - reference/user-stories/README 与实现对齐 验证:./gradlew test ⇒ 122 tests, 0 failures, 1 skipped Refs: ACM2-45
This commit is contained in:
@@ -41,7 +41,7 @@ enum class ErrorClass {
|
||||
/** 解码逻辑的问题;修好 codec 之后可以重放。 */
|
||||
CODEC_ERROR,
|
||||
|
||||
/** 重试次数用尽或队头滞留超时;人工复核后可以重放。 */
|
||||
/** 重试次数用尽(尝试上限);人工复核后可以重放。 */
|
||||
EXHAUSTED,
|
||||
|
||||
/** 数据库、网络等基础设施抖动,重试通常就能过。 */
|
||||
@@ -64,8 +64,13 @@ data class ProcState(
|
||||
val errorClass: ErrorClass? = null,
|
||||
/** 最近一次失败的原因(截断后落库,供排查)。 */
|
||||
val lastError: String? = null,
|
||||
/** 信箱里的接收时间:用来判断"超期仍未回填",也是最老未处理信龄的计算依据。 */
|
||||
/** 信箱里的接收时间,来自**库方时钟**、**可能为 NULL**;仅用于对账与展示,不作任何判据。 */
|
||||
val receivedAt: Instant? = null,
|
||||
/**
|
||||
* 本地入队时间(本系统写入,非空)。超期补写期限 `R` **只比较它**:与判据用的本地
|
||||
* `NOW` 同源,不受库方时钟偏斜影响(`PRE-4`)。
|
||||
*/
|
||||
val enqueuedAt: Instant? = null,
|
||||
/** 非空表示已确认信箱行带上了处理标记。 */
|
||||
val backfillAt: Instant? = null,
|
||||
/** 非空表示还欠一次回填:写终态时置为当前时间,失败后退避推后。 */
|
||||
@@ -73,15 +78,20 @@ data class ProcState(
|
||||
val backfillAttempts: Int = 0,
|
||||
val backfillError: String? = null,
|
||||
/**
|
||||
* 非空表示已判定"不必再回填"(信箱行不存在,或达到尝试上限)。
|
||||
* 非空表示已判定"不必再回填":信箱行不存在,或暂时性故障持续到 `R` 仍未打标。
|
||||
*
|
||||
* **它不等于标记已确认**:`backfillAt` 仍为空,所以不满足"边界内全部行已打标"的清除条件。
|
||||
* 停止重试与"已满足清除前提"是两件事,不能互相替代。
|
||||
*/
|
||||
val backfillAbandonedAt: Instant? = null,
|
||||
/** 放弃原因(`MISSING_ROW` / `MAX_ATTEMPTS`),供人工对账与恢复判断。 */
|
||||
/** 放弃原因(`MISSING_ROW` / `TRANSIENT_DEADLINE`),供人工对账与恢复判断。 */
|
||||
val backfillAbandonedReason: String? = null,
|
||||
/** 首次被主泵取得的时刻;重试不刷新,用作 HOL deadline 的稳定起点。 */
|
||||
/**
|
||||
* 首次被主泵取得的时刻;重试不刷新。
|
||||
*
|
||||
* 当前没有判据消费它(终态只看尝试上限),保留作排障与后续扩展;写入方是
|
||||
* [com.gzzn.omms.msgexchange.infra.persistence.ProcStateRepository.markProcessingStartedIfAbsent]。
|
||||
*/
|
||||
val processingStartedAt: Instant? = null,
|
||||
val updatedAt: Instant = Instant.now(),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user