DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

Quarkus Lambda 开发启动报 Key already registered,区分注册冲突与恢复错误

Quarkus Lambda 与本地 HTTP 注册不同 URI 时可能发生同名 key 冲突。原应用确认 3.37.4 临时基线可启动,正式修复版本未知,应从第一条启动异常定位。

Quarkus Lambda REST 应用在 dev mode 启动时先报 quarkus.http.local-base-uri 已注册,随后又出现 quarkus.http.port 已注册,排查应回到日志中的第一条异常。后者可能来自失败启动后的恢复路径,会遮住真正让 Lambda poll loop 停下来的原因。

对应的异常链有这样的特征:

IllegalArgumentException: Key already registered quarkus.http.local-base-uri
at ValueRegistryImpl.registerInfo
at AbstractLambdaPollLoop.startPollLoop

已确认的具体应用使用 quarkus-rest 与 quarkus-amazon-lambda-rest,在平台 3.39.1、3.39.4 上失败;环境为 JDK 21.0.11、Maven 3.9.12、macOS arm64。该应用保持其他代码不变,切回 3.37.4 后能够启动。这个基线只适用于该 Lambda 场景,不能据此保证所有 Quarkus 扩展组合在旧版都正常。

原因是 HTTP 服务与 Lambda poll loop 都要登记一个 URI,却共用了 quarkus.http.local-base-uri。前者是本地 HTTP 监听地址,后者是 Lambda 调用 API 的地址,两者不是同一个端点。HTTP 注册时会检查这个 key 是否存在,Lambda 则直接注册;HTTP 先完成时,Lambda 的第一次注册已经会冲突。

ValueRegistry 对同名 key 使用拒绝重复登记的规则。清空 registry、改全局异常类型,或吞掉第二次注册,都不是可靠方案:应用还需要正确区分这两个 URI,后续消费者也必须读取对应地址。单纯让进程不抛异常可能把请求导向错误端点。

短期处理可先恢复这个应用已经确认可用的完整 3.37.4 平台基线。若 POM 的 BOM 由下面这个属性管理,就在原入口改值:

<properties>
  <quarkus.platform.version>3.37.4</quarkus.platform.version>
</properties>

若项目用其他版本管理方式,调整实际 BOM 入口,不额外添加一个未被引用的同名属性。核对全部 Quarkus 依赖解析结果,随后停止失败的 dev 进程,重新启动:

./mvnw dependency:tree -Dincludes=io.quarkus
./mvnw quarkus:dev

这是临时回退,应同时评估应用在旧基线上的兼容性和安全更新要求。3.40.1 的正式 Lambda 源码仍使用旧 key,不能宣称升到这个版本就能解决。需要后续正式版本确实包含 Lambda 独立 URI key 及消费者调整后,才能据此采用升级方案。

验收应看到 Lambda poll loop 和本地 HTTP 服务都完成启动,再通过原有本地 Lambda REST 调用确认请求实际到达业务处理。保留第一次启动完整日志,检查没有先出现 local-base-uri 错误,再被恢复阶段的 port 错误替代。只有第二条错误消失,不能说明第一处冲突已修好。

若栈来自 gRPC,重复 key 是 quarkus.grpc.server.port,且开启多个 server instances,则是同端口被多个实例重复发布的另一条路径。它需要处理登记次数,不能把本题的 Lambda 平台回退当成已验证的 gRPC 解法。