feat(processing): GTDT FLOP vertical link with real XmlCodec (P2-0)

Add JacksonXmlCodec (XXE-safe META/FLOP parse), GtdtHandler, and unified
PipelineHolderFactory; route DNLD/FLOP through FlightStateEngine persistNextStates.
This commit is contained in:
windyboy
2026-09-08 11:26:20 +08:00
parent bf1b5a371d
commit a936238368
7 changed files with 315 additions and 57 deletions
@@ -0,0 +1,23 @@
package com.gzzn.omms.msgexchange.infra.pipeline
import com.gzzn.omms.msgexchange.codec.JacksonXmlCodec
import com.gzzn.omms.msgexchange.processing.CodecHolder
import com.gzzn.omms.msgexchange.processing.Handler
import com.gzzn.omms.msgexchange.processing.HandlerHolder
import com.gzzn.omms.msgexchange.processing.HandlerRegistry
import io.micronaut.context.annotation.Bean
import io.micronaut.context.annotation.Factory
import jakarta.inject.Singleton
/** 主泵解码与 Handler 装配(stub / 实装模式共用真实 XmlCodec + 已注册 Handler)。 */
@Factory
class PipelineHolderFactory {
@Bean
@Singleton
fun codecHolder(codec: JacksonXmlCodec): CodecHolder = CodecHolder(codec)
@Bean
@Singleton
fun handlerHolder(handlers: List<Handler>): HandlerHolder = HandlerHolder(HandlerRegistry(handlers))
}
@@ -1,32 +1,13 @@
package com.gzzn.omms.msgexchange.infra.stub
import com.gzzn.omms.msgexchange.codec.DecodeFailure
import com.gzzn.omms.msgexchange.codec.DecodeResult
import com.gzzn.omms.msgexchange.codec.XmlCodec
import com.gzzn.omms.msgexchange.delivery.DeliveryPort
import com.gzzn.omms.msgexchange.domain.ErrorClass
import com.gzzn.omms.msgexchange.processing.CodecHolder
import com.gzzn.omms.msgexchange.processing.HandlerHolder
import com.gzzn.omms.msgexchange.processing.HandlerRegistry
import io.micronaut.context.annotation.Bean
import io.micronaut.context.annotation.Factory
import io.micronaut.context.annotation.Requires
import jakarta.inject.Singleton
/**
* U07stub 适配层——XmlCodec / DeliveryPort / Handler 装配,仅在 msgx.stubs=true 时生效Redis 客户端已按 ACM2-28 移除)
* stub codec 未实装 → 报文 decode 返回 CODEC_ERROR(走 FAILED 可重放路径,链路上可观测),
* 语义见 ACM2-10 U11:不把“未实装”写成报文非法/终态。
* U07stub 适配层——DeliveryPort 内存实现,仅在 msgx.stubs=true 时生效。
* XmlCodec / Handler 由 [com.gzzn.omms.msgexchange.infra.pipeline.PipelineHolderFactory] 统一装配。
*/
@Requires(property = "msgx.stubs", value = "true")
@Singleton
class StubXmlCodec : XmlCodec {
override fun decode(rawXml: String): DecodeResult =
DecodeResult.Err(DecodeFailure(ErrorClass.CODEC_ERROR, "stub:codec-not-implemented"))
override fun encodeRqrd(kind: String, rangeJson: String): String = ""
}
@Requires(property = "msgx.stubs", value = "true")
@Singleton
class StubDeliveryPort : DeliveryPort {
@@ -37,15 +18,3 @@ class StubDeliveryPort : DeliveryPort {
override fun sendKafka(topic: String, payloadJson: String) { sent += topic to payloadJson }
override fun indexFlightHts(payloadJson: String) = Unit
}
/** Holder 工厂:CodecHolder/HandlerHolder 由 Micronaut Bean 提供(取代直连构造占位)。 */
@Factory
@Requires(property = "msgx.stubs", value = "true")
class StubHolderFactory {
@Bean
fun codecHolder(codec: StubXmlCodec): CodecHolder = CodecHolder(codec)
@Bean
fun handlerHolder(): HandlerHolder = HandlerHolder(HandlerRegistry(emptyList())) // 阶段 2 前无 Handler 注册
}