Marker 与 Gate 文件
基本信息
| 属性 | 值 |
|---|---|
| 实现类 | net.sxmaa.headlessnh.IntegrationTestController |
| 写入目录 | headlessnh.markerdir,未设置时回落到 Minecraft.mcDataDir |
| 轮询间隔 | 250 ms(GATE_POLL_INTERVAL_MILLIS) |
| 配套工具 | 无(由外部 CI 编排器读写这些文件) |
HeadlessNH 与外部 CI 之间唯一的通信手段就是磁盘上的文件,没有任何 socket / RCON / 控制台命令。
Marker 文件(进度信号)
流程每到一个关键阶段就 createNewFile() 写出一个标记文件,编排器监视其出现以判断进度。
| 常量 | 默认文件名 | 含义 |
|---|---|---|
MARKER_MAIN_MENU |
.mainmenu.headlessnh |
客户端启动完成、主菜单已到达 |
MARKER_SERVER_LOADED |
.serverloaded.headlessnh |
多人服务器世界已进入并稳定 |
MARKER_WORLD_LOADED |
.worldloaded.headlessnh |
单人世界已进入并稳定 |
文件名可用 headlessnh.marker.mainmenu / .serverloaded / .worldloaded 逐个覆盖。
[!WARNING]
writeMarker在文件已存在时不会复用,而是直接抛RuntimeException("Failed to create HeadlessNH marker ...")。这意味着同一份数据目录跑第二次集成测试时会因为.mainmenu.headlessnh已存在而失败,除非编排器在每轮前清理,或改用headlessnh.marker.*指向新名字。
Gate 文件(阶段闸门)
Gate 是反向信号:设置后,流程在写出该阶段 marker 之后会阻塞等待对应文件出现(每 250 ms 轮询一次),编排器可以据此把测试拆成一步步手动放行。
| 系统属性 | 对应阶段 |
|---|---|
headlessnh.gate.mainmenu |
主菜单 marker 之后 |
headlessnh.gate.serverloaded |
服务器加载 marker 之后 |
headlessnh.gate.worldloaded |
单人世界加载 marker 之后 |
Gate 文件同样解析到 marker 目录下,文件名直接取属性值本身(没有附加后缀)。属性未设置或为空串(emptyToNull)时该阶段不设闸门,立即继续。
超时由 headlessnh.gate.timeout(Long.getLong(..., 0L))控制:
0或负数 →deadline = Long.MAX_VALUE,无限等待- 正数 → 到期调用
fail(...),在主线程抛Failure
等待期间会在日志打印 Waiting for gate file {},放行后打印 Gate file appeared, proceeding。
相关条目
- Stage 状态机 - 哪些阶段会写 marker、哪些阶段会等 gate
- System Properties - 全部属性与默认值
- MinecraftMixin - 触发
awaitMainMenuGate的位置