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:
@@ -5,6 +5,8 @@ import java.time.Duration
|
||||
|
||||
/**
|
||||
* ACMA-8 参数表(v4)初值;阶段 0 现网基线校准。
|
||||
* U03(N02):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
|
||||
|
||||
@@ -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
|
||||
@@ -1,6 +1,8 @@
|
||||
# =====================================================================
|
||||
# msgexchange-nextgen 配置(ACMA-8 v4)
|
||||
# 口令/端点全部环境变量外置——零入库(ACMA-8 契约冻结 + 安全基线)
|
||||
# 键位口径:Micronaut 5.1(U03):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
|
||||
# U04(R01):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/R09:Micronaut 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/N13:logback 在 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 旧列;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- ACMA-8/ACMA-6:logstash TCP JSON 通道保留(字段兼容现网)+ MDC traceId -->
|
||||
<!-- U03/N13:logback 直接读环境变量(前缀 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
|
||||
|
||||
/**
|
||||
* U03(N02)验收: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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user