diff --git a/docs/module-data-flow.html b/docs/module-data-flow.html index 2f5efb97..b59acfc2 100644 --- a/docs/module-data-flow.html +++ b/docs/module-data-flow.html @@ -523,7 +523,7 @@ flowchart LR modules/core/session-core - 设备会话、命令下发抽象、SessionStore、CommandDispatcher 默认实现。SessionStore 支持 memoryredis 两种后端;生产默认使用 Redis 保存 sessionId、VIN 和 phone 三索引及 TTL,内存实现作为本地开发/无 Redis 降级,协议模块只依赖 SPI,不感知存储后端。 + 设备会话、命令下发抽象、SessionStore、CommandDispatcher 默认实现。SessionStore 仅保留 Redis 后端;协议进程本地只保存真实 Netty Channel,Redis 保存 sessionId、VIN 和 phone 三索引及 TTL,协议模块只依赖 SPI,不感知存储细节。 设备连接、命令请求。 会话状态、命令分发结果、Redis 会话索引。 在线状态下行控制多实例会话索引 diff --git a/docs/operations/gb32960-service-split-runbook.md b/docs/operations/gb32960-service-split-runbook.md index a5d04256..9e09e9b6 100644 --- a/docs/operations/gb32960-service-split-runbook.md +++ b/docs/operations/gb32960-service-split-runbook.md @@ -39,8 +39,8 @@ Authorization failures are rejected before the Kafka durability boundary and can - Java 25 and Maven available on PATH. - Local Kafka reachable at `127.0.0.1:9092`, plus Kafka CLI tools such as `kafka-topics` and optionally `kafka-console-consumer`. -- Production GB32960/JT808 session state uses Redis by default. For local - one-process smoke tests without Redis, set `SESSION_STORE=memory` explicitly. +- Session state requires Redis. GB32960/JT808 ingest services keep live Netty + channels in-process, but session indexes and TTL metadata use Redis only. - No repository-local Kafka bootstrap script or compose file was found during Task 8 verification on 2026-06-23. If your shell needs an explicit JDK: @@ -94,7 +94,6 @@ GB32960 ingest: KAFKA_BROKERS=127.0.0.1:9092 \ GB32960_PORT=32960 \ HTTP_PORT=20100 \ -SESSION_STORE=memory \ java --sun-misc-unsafe-memory-access=allow \ -jar modules/apps/gb32960-ingest-app/target/gb32960-ingest-app.jar ``` @@ -105,7 +104,6 @@ JT808 ingest: KAFKA_BROKERS=127.0.0.1:9092 \ JT808_PORT=808 \ HTTP_PORT=20400 \ -SESSION_STORE=memory \ java --sun-misc-unsafe-memory-access=allow \ -jar modules/apps/jt808-ingest-app/target/jt808-ingest-app.jar ``` diff --git a/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/MavenModuleProfileTest.java b/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/MavenModuleProfileTest.java index dd511cb8..c4682b82 100644 --- a/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/MavenModuleProfileTest.java +++ b/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/MavenModuleProfileTest.java @@ -127,6 +127,22 @@ class MavenModuleProfileTest { .doesNotContain("车辆状态/日统计消费"); } + @Test + void productionDocsDoNotAdvertiseMemorySessionStore() throws Exception { + String runbook = Files.readString(repositoryRoot() + .resolve("docs/operations/gb32960-service-split-runbook.md")); + String moduleDataFlow = Files.readString(repositoryRoot().resolve("docs/module-data-flow.html")); + + assertThat(runbook) + .contains("Session state requires Redis") + .doesNotContain("SESSION_STORE=memory") + .doesNotContain("without Redis"); + assertThat(moduleDataFlow) + .contains("SessionStore 仅保留 Redis 后端") + .doesNotContain("SessionStore 支持 memory") + .doesNotContain("无 Redis 降级"); + } + @Test void rootPomDescriptionMatchesCurrentRuntimeStack() throws Exception { Document pom = rootPom();