feat(acm2): 闭合 G-KAFKA-D3 / G-IGNORE / G-EVENT-RETENTION 三个缺口
- G-KAFKA-D3:max-in-flight 默认收敛到 1,KafkaD3Check 启动自检钉住三项联合满足 D3 - G-IGNORE:IgnoreRules 在身份绑定后精确匹配 TYPE 字段,命中写 SKIPPED + 回填意图 - G-EVENT-RETENTION:V10 迁移加 SENT_AT 列,投递原子写,EventCleanupJob 有界清理过期 SENT 行
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
package com.gzzn.omms.msgexchange.processing
|
||||
|
||||
/**
|
||||
* US-04 忽略清单:基线规则为 `LDM-*`、`REGN-*`、`RSTA-*`、`EROR-*`。
|
||||
*
|
||||
* 匹配按 `TYPE` 前缀做(`TYPE-*` 表示该 TYPE 下所有 STYP 均忽略);
|
||||
* `MetaFields.type` 已由 codec 统一大写,这里直接用大写常量比较。
|
||||
* 返回命中的规则标签(如 `LDM-*`),未命中返回 null。
|
||||
*/
|
||||
object IgnoreRules {
|
||||
private val rules: List<Pair<String, String>> = listOf(
|
||||
"LDM" to "LDM-*",
|
||||
"REGN" to "REGN-*",
|
||||
"RSTA" to "RSTA-*",
|
||||
"EROR" to "EROR-*",
|
||||
)
|
||||
|
||||
fun match(type: String): String? {
|
||||
for ((prefix, label) in rules) {
|
||||
if (type == prefix) return label
|
||||
}
|
||||
return null
|
||||
}
|
||||
}
|
||||
@@ -211,6 +211,15 @@ class MessageProcessor(
|
||||
}
|
||||
}
|
||||
|
||||
// US-04:忽略清单命中 → SKIPPED + 回填意图,不取 PIPELINE_LOCK、不写航班表、不创建 MSG_EVENT
|
||||
val ignoreRule = IgnoreRules.match(decoded.meta.type)
|
||||
if (ignoreRule != null) {
|
||||
log.info("ignored:{} -> SKIPPED msgId={}", ignoreRule, head.msgId)
|
||||
counters.ignoredAdd()
|
||||
procState.markTerminal(head.msgId, ProcStatus.SKIPPED, lastError = "ignored:$ignoreRule", now = clock.instant())
|
||||
return
|
||||
}
|
||||
|
||||
// 按报文类型分派:日计划走 SCHD,其余走 FLOP / FDEL / ADFT;报文缺载荷直接判为非法报文的死信
|
||||
val result: ApplyResult = when (val kind = decoded.kind) {
|
||||
is MsgKind.Schd -> {
|
||||
|
||||
Reference in New Issue
Block a user