feat(build): 阶段0 冒烟底座(ACM2-10 U01–U04)

- U01:接入 KSP(kotlin-ksp 2.3.0)+micronaut-inject-kotlin,Micronaut BeanDefinition 由 0→94 个生成;
  移除 processing.annotations 业务包过滤(N23)
- U02:补 Gradle wrapper(9.6.1);版本矩阵单一来源——micronaut 固定 5.1.3(gradle.properties
  micronaut.version,平台 BOM 最高发布版)、JDK25 口径统一、snakeyaml 版本入 catalog;
  新增 .github/workflows/ci.yml 与 Dockerfile;.gitignore 补 .kotlin/.opencode/.zcode/.gradle-*
- U03:application.yml 键位修正(datasources.default/flyway.datasources.default/kafka.producers.default),
  移除 logstash 死配置块、logback env 统一 MSGX_LOGSTASH_*;新增 application-dev.yml(/env、/beans
  仅开发放开);PipelineProps 四嵌套类补 @ConfigurationProperties;新增 PipelinePropsBindingTest
  (改值—回读离线验收,Micronaut Test 5.x 用 TestPropertyProvider)
- U04:README「数据库初始化」与 V2.0.0 脚本头声明 CMINMSGS legacy 前置(全新库需先建旧表)
This commit is contained in:
windyboy
2026-09-06 17:59:07 +08:00
parent 38d5cecfac
commit 821da1334c
18 changed files with 558 additions and 23 deletions
@@ -5,6 +5,8 @@ import java.time.Duration
/**
* ACMA-8 参数表(v4)初值;阶段 0 现网基线校准。
* U03N02):Micronaut 要求嵌套配置类同样标注 @ConfigurationProperties,否则 msgx.pipeline/schd/
* identity/consistency-check.* 全部静默回落 Kotlin 默认值(当前 yml 初值与默认值一致,现象被掩盖)。
*/
@ConfigurationProperties("msgx")
class PipelineProps {
@@ -18,6 +20,7 @@ class PipelineProps {
enum class Phase { A, B }
@ConfigurationProperties("pipeline")
class Pipeline {
var pollInterval: Duration = Duration.ofSeconds(1) // KEEP 现役节奏
var claimBatch: Int = 50
@@ -30,16 +33,19 @@ class PipelineProps {
backoffMs.drop(attempt - 1).firstOrNull()?.coerceAtMost(backoffCapMs) ?: backoffCapMs
}
@ConfigurationProperties("schd")
class Schd {
var flushPeriod: Duration = Duration.ofSeconds(3) // KEEP 现役节律
var flushLimit: Int = 500
}
@ConfigurationProperties("identity")
class Identity {
/** CONFIRM(矩阵 #11):SEQN 重置作用域确认前保持 false,计算集中此处(I3)。 */
var includeDayBoundary: Boolean = false
}
@ConfigurationProperties("consistency-check")
class ConsistencyCheck {
var onStartup: Boolean = true // 阶段 A 必选哨兵
var dailySampleRatio: Double = 0.01
+13
View File
@@ -0,0 +1,13 @@
# 开发/影子对拍环境 profile(U03/N32):放开管理端点可见性以便“改值—回读”与 /beans 装配核验。
# 生产环境不加载本 profile/env、/beans 保持默认 sensitive)。
# 启动:MICRONAUT_ENVIRONMENTS=dev ./gradlew run
micronaut:
endpoints:
env:
enabled: true
sensitive: false
beans:
enabled: true
sensitive: false
server:
port: 8080
+21 -13
View File
@@ -1,6 +1,8 @@
# =====================================================================
# msgexchange-nextgen 配置(ACMA-8 v4
# 口令/端点全部环境变量外置——零入库(ACMA-8 契约冻结 + 安全基线)
# 键位口径:Micronaut 5.1U03):datasources.* / flyway.datasources.* /
# kafka.producers.<name>.* / eureka.client.*Micronaut 原生键,勿改回 datasource 单数或 Spring 风格)。
# =====================================================================
msgx:
phase: A # A=Redis 权威(主泵单线程写,I5);B=FLIGHT_STATE 权威+投影
@@ -27,16 +29,22 @@ micronaut:
name: msgexchange-nextgen
server:
port: 8080
# 管理端点(U03/N32):/env、/beans 默认 sensitive;仅开发/影子环境放开——见 application-dev.yml
datasource:
url: ${MSGX_DB_URL}
username: ${MSGX_DB_USER}
password: ${MSGX_DB_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
datasources:
default:
url: ${MSGX_DB_URL}
username: ${MSGX_DB_USER}
password: ${MSGX_DB_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
flyway:
enabled: true
locations: classpath:db/migration
datasources:
default:
enabled: true
locations: classpath:db/migration
# U04R01):V2.0.0 只建六张辅助表,假定 CMINMSGS/CMINMSGS_HST 等 legacy 旧表已存在;
# 全新库请按 README「数据库初始化」先落 legacy schema(或 baseline),否则收报首句 SQL 会报表不存在。
redis:
uri: ${MSGX_REDIS_URI} # 阶段 A 权威存储;仅主泵线程写(I5)
@@ -45,8 +53,9 @@ kafka:
bootstrap:
servers: ${MSGX_KAFKA_SERVERS}
producers:
acks: all
enable-idempotence: true
default: # U03/R09Micronaut Kafka 按具名 producer 解析,须有 default 层
acks: all
enable-idempotence: true
eureka:
client:
@@ -54,7 +63,6 @@ eureka:
enabled: ${msgx.register-eureka}
default-zone: ${MSGX_EUREKA_URL:http://127.0.0.1:8761/eureka}
# logstash TCP JSON 通道保留(字段兼容现网,ACMA-3 部署前提)——见 logback.xml
logstash:
host: ${MSGX_LOGSTASH_HOST:127.0.0.1}
port: ${MSGX_LOGSTASH_PORT:5044}
# logstash TCP JSON 通道保留(字段兼容现网,ACMA-3 部署前提)
# U03/N13logback 在 Micronaut 配置体系之外独立初始化,不读本文件——地址见 logback.xml
# 环境变量统一前缀 MSGX_LOGSTASH_HOST / MSGX_LOGSTASH_PORT(不要再在此处定义 logstash.* 死键)。
@@ -1,6 +1,10 @@
-- =====================================================================
-- ACMA-8 v4 数据模型(六表)· Flyway 基线迁移
-- 与 issue「综合架构设计」数据模型节逐字一致;影子实例在独立 schema 执行同一脚本。
--
-- U04/R01 前置声明:本脚本只建六张辅助表,假定 CMINMSGS/CMINMSGS_HST/COUTMSGS 等 legacy
-- 旧表已存在(本仓库不声明旧表 V1,归 legacy 仓库维护)。全新空库请先按 legacy schema
-- 建旧表再执行本脚本,否则收报首句 SQL 会报表不存在(详见 README「数据库初始化」)。
-- =====================================================================
-- ① 处理状态伴生表(不动 CMINMSGS 旧列;
+2 -1
View File
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- ACMA-8/ACMA-6logstash TCP JSON 通道保留(字段兼容现网)+ MDC traceId -->
<!-- U03/N13logback 直接读环境变量(前缀 MSGX_LOGSTASH_*),与 application.yml 不再双定义 -->
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
@@ -8,7 +9,7 @@
</appender>
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>${LOGSTASH_HOST:-127.0.0.1}:${LOGSTASH_PORT:-5044}</destination>
<destination>${MSGX_LOGSTASH_HOST:-127.0.0.1}:${MSGX_LOGSTASH_PORT:-5044}</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<includeMdcKeyName>traceId</includeMdcKeyName>
</encoder>
@@ -0,0 +1,49 @@
package com.gzzn.omms.msgexchange.nextgen.config
import io.micronaut.test.extensions.junit5.annotation.MicronautTest
import io.micronaut.test.support.TestPropertyProvider
import jakarta.inject.Inject
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance
import java.time.Duration
/**
* U03N02)验收:msgx.* 嵌套键「改值—回读」离线化。
* 四个嵌套类(Pipeline/Schd/Identity/ConsistencyCheck)须标注 @ConfigurationProperties 才会被绑定;
* 未标注时下列覆盖值会静默回落 Kotlin 默认值(本测试即红)。仅注入配置 bean,不触碰仓储/DB。
* 注:Micronaut Test 5.x 移除 @Property 注解,改以 TestPropertyProvider 注入测试属性(需 PER_CLASS)。
*/
@MicronautTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class PipelinePropsBindingTest : TestPropertyProvider {
override fun getProperties(): Map<String, String> = mapOf(
"msgx.pipeline.poll-interval" to "PT7S",
"msgx.pipeline.max-attempts" to "9",
"msgx.schd.flush-limit" to "321",
"msgx.identity.include-day-boundary" to "true",
"msgx.consistency-check.daily-sample-ratio" to "0.05",
)
@Inject
lateinit var props: PipelineProps
@Test
fun `nested msgx keys bind from test properties`() {
assertEquals(Duration.ofSeconds(7), props.pipeline.pollInterval)
assertEquals(9, props.pipeline.maxAttempts)
assertEquals(321, props.schd.flushLimit)
assertTrue(props.identity.includeDayBoundary)
assertEquals(0.05, props.consistencyCheck.dailySampleRatio, 1e-9)
}
@Test
fun `top-level scalars still bind`() {
assertEquals(PipelineProps.Phase.A, props.phase)
assertEquals("msgexchangeapi", props.serviceName)
assertFalse(props.registerEureka) // application-test.yml 置 false
}
}
+28
View File
@@ -0,0 +1,28 @@
# U03 配置绑定回归测试专用环境(@MicronautTest 默认 environment=test
# 目的:让 ApplicationContext 可无外部依赖启动(内存 datasource / 关闭迁移 / 关闭注册),
# 以便以「注入 PipelineProps 断言」离线验证 msgx.* 嵌套键绑定(N02 验收),不依赖 /env 端点。
datasources:
default:
url: jdbc:h2:mem:cfgtest;DB_CLOSE_DELAY=-1
username: sa
password: ""
driver-class-name: org.h2.Driver
flyway:
datasources:
default:
enabled: false
redis:
uri: redis://127.0.0.1:6379
kafka:
bootstrap:
servers: 127.0.0.1:9092
msgx:
register-eureka: false
micronaut:
server:
port: 0