# JavaNexus **Repository Path**: solidify-the-foundation/java-nexus ## Basic Information - **Project Name**: JavaNexus - **Description**: java的项目 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-12 - **Last Updated**: 2026-08-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JavaNexus JavaNexus 是一个面向 JDK 21 的微型企业级任务执行平台。它不是 Spring Boot CRUD 示例,而是一座用于验证 DDD、并发治理、JVM 运行时和韧性设计的可运行实验场。 当前版本 `0.1.0-SNAPSHOT` 已交付两条纵向切片:第一条完成任务生命周期与有界虚拟线程执行, 第二条加入 PostgreSQL 聚合仓储和 Transactional Outbox,使业务状态与待发布领域事件在同一事务中 提交,并能在发布进程中断后恢复投递。 ## 已实现能力 - 纯 Java 的 `Job` 聚合:`ACCEPTED → RUNNING → 终态`,非法迁移立即失败。 - 两种真实持久化 adapter:原子内存仓储用于快速实验,PostgreSQL 用于生产形态验证。 - Transactional Outbox:事务内追加、租约认领、`SKIP LOCKED` 多实例竞争、重试和死信。 - 有界虚拟线程编排器:容量背压、任务键去重、超时、中断、取消和优雅关闭。 - Spring Boot REST 适配器、参数校验、统一错误响应和 Actuator 探针。 - JDK Unified Logging GC Pause 分析器:统计总暂停、最大值、P50/P95/P99。 - JUnit、ArchUnit、JaCoCo 和 JMH 基线;架构测试守护核心层依赖方向。 - ADR、JVM 调优清单、容器构建和分阶段演进路线。 ## 架构 ```mermaid flowchart LR Client["REST Client"] --> App["nexus-app
application orchestration"] App --> Core["nexus-core
Job aggregate + ports"] App --> Infra["nexus-infra
virtual threads + adapters"] Infra --> Core Infra --> Postgres[("PostgreSQL
jobs + outbox_events")] Relay["Outbox relay
at-least-once"] --> Postgres Relay --> Broker["Publisher adapter
logging / future Kafka"] App --> Runtime["nexus-runtime
GC analysis"] Tests["nexus-tests
ArchUnit + JMH"] --> Core Tests --> Infra Tests --> Runtime ``` 依赖只向内:`nexus-core` 不依赖 Spring,也不知道持久化和线程模型。并发模块的外部接口只有 `submit/cancel/snapshot`,调用方无需理解许可释放、定时器与中断竞态。 ## 快速启动 要求 JDK 21 与 Maven 3.9+。 ```bash mvn clean verify mvn -pl nexus-app -am spring-boot:run ``` 提交一个 200 ms 的模拟作业: ```bash curl -i http://localhost:8080/api/v1/jobs \ -H 'Content-Type: application/json' \ -d '{ "name":"invoice-rebuild", "payload":"tenant-42", "timeoutMillis":2000, "simulatedDurationMillis":200, "fail":false }' ``` 响应中的 `Location` 可用于查询和取消: ```bash curl http://localhost:8080/api/v1/jobs/ curl -X DELETE http://localhost:8080/api/v1/jobs/ curl http://localhost:8080/actuator/health ``` 默认 profile 使用内存 adapter。要运行 PostgreSQL + Outbox 的完整链路: ```bash docker compose up -d postgres mvn -pl nexus-app -am spring-boot:run -Dspring-boot.run.profiles=postgres ``` Flyway 会创建 `jobs` 与 `outbox_events`。relay 每次以短事务认领一批事件;发布成功后确认,失败则按 配置延迟重试,达到最大次数后写入死信状态。交付语义是 **at-least-once**:将来接 Kafka 时必须把 `OutboxMessage.id` 作为消息键,并在消费者侧建立幂等记录。 ## JVM 实验 生成包含 GC、安全点和文件轮转信息的日志: ```bash java -Xms256m -Xmx256m -XX:+UseG1GC \ -Xlog:gc*,safepoint:file=gc.log:time,uptime,level,tags:filecount=5,filesize=20m \ -jar nexus-app/target/nexus-app-0.1.0-SNAPSHOT.jar ``` 分析 Pause 分布: ```bash mvn -pl nexus-runtime -am package java -cp nexus-runtime/target/nexus-runtime-0.1.0-SNAPSHOT.jar \ io.javanexus.runtime.gc.GcLogCli gc.log ``` 运行虚拟线程与平台线程的阻塞负载基准: ```bash mvn -pl nexus-tests -am test-compile mvn -pl nexus-tests -Dexec.mainClass=org.openjdk.jmh.Main \ org.codehaus.mojo:exec-maven-plugin:3.5.0:java ``` 基准结果必须连同 CPU、内存、JDK 构建号和 JVM 参数一起保存,禁止只提交一个孤立数字。 ## 模块地图 | 模块 | 当前职责 | 下一适配器/实验 | |---|---|---| | `nexus-core` | 聚合、值对象、领域事件、持久化接口 | DAG 规约、幂等提交键 | | `nexus-infra` | 虚拟线程编排、双仓储 adapter、Transactional Outbox relay | Kafka、消费者幂等、Redis | | `nexus-runtime` | GC Pause 日志分析 | Instrumentation Agent、JFR 事件读取 | | `nexus-app` | REST、应用编排、配置和健康检查 | OpenTelemetry、Resilience4j | | `nexus-tests` | 架构规则与 JMH | Testcontainers、故障注入、容量模型 | 完整路线见 [docs/ROADMAP.md](docs/ROADMAP.md),设计理由见 [docs/adr](docs/adr),调优实验模板见 [docs/JVM_TUNING_CHECKLIST.md](docs/JVM_TUNING_CHECKLIST.md)。 ## 设计纪律 1. 每个生产能力必须有失败路径测试,不能只测 Happy Path。 2. 每次性能结论必须包含基线、变量、数据、代价和最终选择。 3. 新基础设施先通过核心层接口接入,禁止把 Spring/JPA/Kafka 类型泄漏进领域模型。 4. 只有出现第二个真实实现或测试替身时才增加新的可替换接口,避免过度抽象。 5. Outbox publisher 只能承诺至少一次;消费者必须用事件 ID 去重,禁止把“正常情况下只发一次”当保证。